opencv 灰度图转彩色,opencv根据颜色划分区域
空间类型转换的颜色模型是一个抽象的数学模型,描述了使用一组值(通常是三个或四个值或颜色分量)来表示颜色的方法。
常见的色彩空间包括:
灰度颜色空间(灰度图像)XYZ颜色空间YCrCb颜色空间HSV颜色空间HLS颜色空间CIELab颜色空间CIELuv颜色空间Bayer颜色空间和其他颜色空间类型转换是指将图像从一种颜色空间转换到另一种颜色空间。
使用OpenCV处理图像时,可以在RGB颜色空间和HSV颜色空间之间进行转换。
在特征提取和距离计算过程中,通常将图像从RGB颜色空间处理到灰度颜色空间。
在某些应用中,可能需要将色彩空间中的图像转换为二值图像。
色彩空间也叫色彩空间、色彩空间、色彩模型、色彩系统、色彩模型、色彩模型等。
色彩基础灰度色彩空间灰度(灰度图像)通常指8位灰度图像,有256个灰度级,像素值范围为[0,255]。
当图像从RGB颜色空间转换到灰度颜色空间时,其处理模式如下:
GRAY=0.299*R 0.587*G 0.114*B当图像从灰色色彩空间转换到RGB色彩空间时,最终所有通道的值都是相同的。其加工方法如下:
r=灰色
g=灰色
B=GrayXYZ颜色空间XYZ颜色空间是由CIE(国际照明委员会)定义的,这是一种更容易计算的颜色空间,可以用RGB颜色空间进行转换。
将RGB颜色空间转换到XYZ颜色空间,转换形式为:
将XYZ色彩空间转换为RGB色彩空间,转换形式为:
YCrCb颜色空间人类视觉系统(HVS)对颜色的敏感度低于对亮度的敏感度。
在YCrCb颜色空间中,y表示光源的亮度,色度信息存储在Cr和Cb中,其中Cr表示红色分量信息,Cb表示蓝色分量信息。
亮度给出了颜色的亮或暗的信息,可以通过照度中强度分量的加权和来计算。在RGB光源中,绿色分量的影响最大,蓝色分量的影响最小。
RGB色彩空间到YCrCb色彩空间的转换公式为:
Y=0.299 R 0.587 G 0.114 B
Cr=(R-Y)0.713
Cb=(b-y) 0.564公式中的值为:
从YCrCb颜色空间到RGB颜色空间的转换公式为:
R=Y 1.403*(Cr-delta)
g=Y-0.714 *(Cr-delta)-0.344(c B- delta)
B=Y 1.773*(Cb-delta),delta的值与上式相同。
HSV色彩空间RGB从硬件角度来说是一个色彩模型,在与人眼匹配的过程中可能会有一些差异。HSV颜色空间是一种面向视觉感知的颜色模型。
指出人眼对颜色的感知主要包括三个要素:色相(Hue,也叫色调)、饱和度和亮度(Value)。
色相是指光的颜色,饱和度是指颜色的深浅,亮度是指人眼感知的光的强度。
色相:色相与混合光谱中的主光波长有关。例如,“红、橙、黄、绿、蓝、紫”代表不同的色调。从波长的角度来看,不同波长的光表现出不同的颜色,但实际上反映的是色相的差异。
饱和度:指的是相对纯度,或者说白光与一种颜色混合的量。纯色是完全饱和的,而像深红色(红色加白色)和淡紫色(紫色加白色)这样的颜色是欠饱和的,饱和度与加入的白光量成反比。
亮度:反映人眼感知的光的亮度。这个指标与物体的反射率有关。至于颜色,白色越多,亮度越高。黑色越多,亮度越低。
将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色。因此,可以通过调整色相值来选择不同的颜色,色相值范围为[0,360]。
饱和度是一个比例值,范围为[0,1],特别是所选颜色的纯度值与颜色的最大纯度值之间的比率。当的饱和度值为0时,只有灰度。表示颜色的亮度,取值范围也是[0,1]。在从RGB色彩空间转换到HSV色彩空间之前,需要在处理之前将RGB色彩空间的值转换为[0,1]。具体处理方法如下:
因此,计算中可能会有H 0。如果发生这种情况,需要进一步计算H,如下所示。
由上述公式计算可知:
[0,1]
V[0,1]
0,360
所有这些转换都封装在OpenCV的cv2.cvtColor()函数中。通常我们直接调用这个函数来完成色彩空间转换,而不考虑函数的内部实现细节。
HLS色彩空间HLS色彩空间包含三个元素:色相H(色相)、明度/明度L(明度)和饱和度S(饱和度)。
类似HSV颜色空间,但是HLS颜色空间用“亮度/明度L(明度)”代替了“值”。
色调:表示人眼能感知的颜色。在HLS模型中,所有的颜色都分布在一个平面的音环上,整个音环是一个360度的圆心角,不同的角度代表不同的颜色。
亮度/明度:用于控制颜色的明暗变化,取值范围也是[0,1]。我们通过亮度/明度来衡量物体表面反射的光量。亮度/明度对于眼睛感知颜色非常重要,因为当一个有色物体处于光线太强或太暗的地方时,眼睛无法准确感知物体的颜色。
饱和度:用[0,1]的值来描述同一色相和明度/明度下颜色纯度的变化。饱和度值越大,颜色的纯度越高,颜色越亮;反之,饱和度值越小,颜色的纯度越低,颜色越深。这个属性通常用来表示颜色的深浅,比如深绿色和浅绿色。
CIELab*颜色空间CIEL*a*b*颜色空间是一种均匀的颜色空间模型,是一种用于视觉感知的颜色模型。
从视觉感知均匀性的角度来看,人所感知的两种颜色的差异程度应该与颜色空间中两种颜色之间的距离成正比。在一定的颜色空间中,如果人们所观察到的两种颜色之间的差异程度与这两种颜色在颜色空间中对应点之间的欧氏距离成正比,则称该颜色空间为均匀颜色空间。
CIE * A * B *颜色空间中的L*分量用来表示像素的亮度,取值范围为[0,100],表示从纯黑到纯白;*分量A代表从红色到绿色的范围,取值范围为[-127,127];b*分量表示从黄色到蓝色的范围,取值范围为[-127,127]。
在从RGB色彩空间转换到CIEL*a*b*色彩空间之前,需要将RGB色彩空间的值转换到[0,1]之后再进行处理。
由于CIEL*a*b*颜色空间是在CIE XYZ颜色空间的基础上发展起来的,所以需要先将RGB转换到XYZ颜色空间,然后再转换到CIEL*a*b*颜色空间。具体实现方法如下:
结果中每个值的范围是:
[0,100]
a[-127,127]
B[-127,127CIELuv*颜色空间CIEL*u*v*颜色空间和CIEL*a*b*颜色空间一样,都是统一的颜色模型。CIE * U * V *色彩空间与设备无关,适用于根据加色原理进行显示和组合的场合。模型强调红色的表征,即对红色的变化敏感,对蓝色的变化不敏感。
从RGB颜色空间到CIEL*u*v*颜色空间的转换过程需要先转换到XYZ颜色空间。
从RGB颜色空间到XYZ颜色空间的转换;
从XYZ颜色空间到CIEL*u*v*颜色空间的转换;
结果中每个值的取值范围如下:
[0,100]
u[-134,220]
V[-140,122]拜耳颜色空间拜耳颜色空间(拜耳模型)广泛应用于CCD和CMOS相机中。它可以从如图4-1所示的单一平面R、G、B交错表中获得彩色图像。
输出RGB图像的像素值是根据当前点的1、2或4个相邻像素的相同颜色的像素值得到的。
上述模式可以通过移动左侧像素或上部像素来修改。
在函数cv2.cvtColor()的色彩空间转换参数中,通常使用两个特定的参数x和y来表示特定的图案。
模式组合由上图第二行第2列和第3列中的值指定。上图是典型的“BG”模式。
常见的模式有很多,比如cv2。COLOR_BayerBG2BGR,cv2。COLOR_BayerGB2BGR,cv2。COLOR_BayerRG2BGR,cv2。COLOR_BayerGR2BGR,cv2。COLOR_BayerBG2RGB,cv2。COLOR_BayerGB2RGB和cv2.color _ Bayer rgb。
类型转换函数在OpenCV中,cv2.cvtColor()函数用于转换颜色空间。
该功能可以实现多个色彩空间之间的转换。
DST=cv2.cvtcolor (src,code [,dstcn]) DST表示输出图像,其数据类型和深度与原始输入图像相同。Src表示原始输入图像。它可以是8位无符号图像、16位无符号图像或单精度浮点数。代码是一个色彩空间转换代码
DstCn是目标图像的通道数。如果该参数默认为0,则通道数由原始输入图像和代码自动获得。
对于标准的24位位图,BGR色彩空间中的第一个8位(第1字节)存储蓝色分量信息,第二个8位(第2字节)存储绿色分量信息,第三个8位(第3字节)存储红色分量信息。类似地,第4、第5、第6字节分别存储蓝色、绿色、红色分量信息,等等。
以下约定用于颜色转换:
8位图像值的范围是[0,255]。16位图像值的范围是[0,65535]。浮点图像值的范围是[0.0~1.0]。对于线性变换,这些值的范围是不相关的。然而,对于非线性转换,输入RGB图像必须归一化到其相应的值范围,以便获得正确的转换结果。
描述:
对于一个8位图,有28=256个灰度级可以表示,即在一个8位图中,最多可以表示256个状态,通常是在[0,255]之间的值。然而,在许多色彩空间中,值的范围并不正好在[0,255]的范围内。这时候就需要把这个值映射到[0,255]。在HSV或HLS色彩空间中,色调值通常在[0,360]的范围内。在8位图中转换到上述色彩空间后,色相值要除以2,使其取值范围变为[0,180]以满足存储范围,即取值分布要在8位图所能表示的范围[0,255]内。例如,在CIELab*色彩空间中,通道A和通道B的值的范围是[-127,127],为了使其适应[0,255]的范围,每个值都加上127。但是,需要注意的是,由于计算过程中的舍入,转换过程是不准确和不可逆的。类型转换实例将BGR图像转换为灰度图像。rst=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)导入cv2
将numpy作为np导入
img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rst=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)
print(img=\n ,img)
print(rst=\n ,rst)
Print(像素点(1,0)的直接计算值)=,
img[1,0,0]*0.114 img[1,0,1]*0.587 img[1,0,2]*0.299)
Print (Pixels (1,0)使用公式cv2.cvtColor()转换值=,rst[1,0])在OpenCV中,灰度图像直接存储在行和列中。而BGR模式下的图像将以行为单位在n阵列的列中顺序存储其b通道、g通道和r通道中的像素。
当图像从RGB颜色空间转换到灰度颜色空间时,其处理模式如下:
灰度=0.299 R 0.587 G 0.114 B将灰度图像转换为BGR图像导入cv2
将numpy作为np导入
img=np.random.randint(0,256,size=[2,4],dtype=np.uint8)
rst=cv2.cvtColor(img,cv2。COLOR_GRAY2BGR)
print(img=\n ,img)
Print(rst=\n ,rst)当图像从灰度色彩空间转换到RGB/BGR色彩空间时,最后所有通道的值都是相同的。处理方法如下:
r=灰色
g=灰色
b=灰色在BGR和RGB模式之间转换图像。导入cv2
将numpy作为np导入
img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rgb=cv2.cvtColor(img,cv2。COLOR_BGR2RGB)
bgr=cv2.cvtColor(rgb,cv2。COLOR_RGB2BGR)
print(img=\n ,img)
打印( rgb=\n ,rgb)
打印( BGR=\n ,BGR)在bgr模式和灰度图像导入cv2之间转换图像。
lena=cv2.imread(lenacolor.png )
gray=cv2.cvtColor(lena,cv2。COLOR_BGR2GRAY)
rgb=cv2.cvtColor(灰色,cv2。COLOR_GRAY2BGR)
#=======打印形状==========
print(lena.shape=,lena.shape)
print(gray.shape=,gray.shape)
print(rgb.shape=,rgb.shape)
#=======显示效果==========
cv2.imshow(lena ,lena)
cv2.imshow(gray ,灰色)
cv2.imshow(rgb ,rgb)
cv2.waitKey()
cv2.destroyAllWindows()
在“RGB=cv2.cvtcolor (gray,cv2.color _ gray2bgr)”得到的RGB图像中,B通道、G通道、R通道的值都是一样的,所以看起来还是灰度图像。
图像从BGR模式到RGB模式导入cv2
lena=cv2.imread(lenacolor.png )
rgb=cv2.cvtColor(lena,cv2。COLOR_BGR2RGB)
cv2.imshow(lena ,lena)
cv2.imshow(rgb ,rgb)
cv2.waitKey()
2.破坏性窗口的HSV颜色空间讨论()通过HSV颜色空间,通过色相、饱和度、明度来感知颜色更方便。
HSV颜色空间,从心理学和视觉的角度,提出人眼的颜色感知主要包括三个要素。
h:色相(Hue,又称色相)。学生:饱和度。v:亮度(值)。色相H在HSV色彩空间,色相H的取值范围是[0,360]。
8位图像中每个像素可以表示28=256个灰度级,所以在8位图像中表示HSV图像时,色相的角度值应该映射到[0,255]的范围内。在OpenCV中,可以直接将色相的角度值除以2,得到一个在[0,180]之间的值,以适应8位二进制(256灰度级)的存储和表示范围。
在HSV空间中,色调值0表示红色,色调值300表示洋红色。
无论饱和度和亮度如何,每个色调值都对应于一种指定的颜色。
在OpenCV中,色相值除以2后,会得到以下色相值和对应的颜色。
s饱和度值的范围是[0,1]
灰度中包含的R、G、B分量相等,相当于一种非常不饱和的颜色。因此,灰色的饱和度值为0。当显示为灰度图像时,对应于较亮区域的颜色具有较高的饱和度。如果颜色的饱和度很低,那么它计算出来的色相就不可靠。2.CVTColor()函数,颜色空间转换后,为了适应8位图的256像素级别,需要将新颜色空间中的值映射到[0,255]的范围内。因此,饱和度s的值也应该从[0,1]映射到[0,255]。
v亮度的范围和饱和度的范围一致,都是[0,1]。类似地,在OpenCV中,亮度值将值映射到范围[0,255]。
亮度越大,图像越亮;亮度值越低,图像越暗。当亮度值为0时,图像为纯黑色。
获得指定的颜色你可以用很多方法在HSV颜色空间中获得RGB颜色空间的对应值。比如RGB值对应的HSV值,可以通过图像编辑软件或者在线网站获得。
注意,当从RGB/BGR色彩空间转换到HSV色彩空间时,OpenCV会映射HSV空间的值,以便满足8位映射的要求。因此,通过软件或网站获得的HSV值需要进一步映射,以与OpenCV中的HSV值保持一致。
例子
将蓝色、绿色和红色这三种不同的颜色从BGR颜色空间转换到HSV颜色空间,并且观察转换后获得的HSV空间的相应值。
导入cv2
将numpy作为np导入
#=======测试OpenCV中蓝色的HSV模式值=========
imgBlue=np.zeros([1,1,3],dtype=np.uint8)
imgBlue[0,0,0]=255
蓝色=imgBlue
BlueHSV=cv2.cvtColor(蓝色,cv2。COLOR_BGR2HSV)
打印( Blue=\n ,蓝色)
print(BlueHSV=\n ,BlueHSV)
#=======在OpenCV中测试绿色的HSV模式值=========
imgGreen=np.zeros([1,1,3],dtype=np.uint8)
imgGreen[0,0,1]=255
绿色=imgGreen
GreenHSV=cv2.cvtColor(绿色,cv2。COLOR_BGR2HSV)
打印(绿色=\n ,绿色)
print(GreenHSV=\n ,GreenHSV)
#=======在OpenCV中测试红色HSV模式值==========
imgRed=np.zeros([1,1,3],dtype=np.uint8)
imgRed[0,0,2]=255
红色=imgRed
RedHSV=cv2.cvtColor(红色,cv2。COLOR_BGR2HSV)
打印( Red=\n ,Red)
Print(RedHSV=\n ,RedHSV) mark指定HSV颜色空间中的颜色,H通道(饱和度色相通道)对应不同的颜色。换个角度来说,颜色的不同主要体现在H通道值的不同。因此,通过过滤H通道值,可以筛选出特定的颜色。
在HSV图像中,如果通过控制只显示H通道中值为240(OpenCV中调整为120)的像素,则图像中只会显示蓝色部分。
您可以遮罩图像中的其他颜色,只显示特定的颜色。
通过inRange函数锁定特定值
在OpenCV中,使用函数cv2.inRange()来判断图像中像素的像素值是否在指定的范围内。其语法格式为:DST=cv2.inrange (src,lower,upper) DST表示输出结果,大小与src一致。
src表示要检查的阵列或图像。
lowerb表示范围的下限。
upperb表示范围的上限。
返回值dst等于src,其值取决于src中对应位置的值是否在区间[下,上]:
如果src值在规定的区间内,则dst中相应位置的值为255。
如果src值不在规定的区间内,则dst中相应位置的值为0。
使用函数cv2.inRange()在图像中标记[100,200]内的值。
导入cv2
将numpy作为np导入
img=np.random.randint(0,256,size=[5,5],dtype=np.uint8)
最小值=100
最大值=200
mask=cv2.inRange(img,min,max)
print(img=\n ,img)
print返回的结果掩码( mask=\n ,mask)可以理解为与原数组大小相同的掩码数组。
通过基于遮罩的按位and显示ROI
特定图像内的感兴趣区域(ROI)正常显示,而其余区域以黑色显示。选择一个颜色间隔,其半径通常为10左右。在HSV模式下,S通道和V通道的取值范围一般为[100,255]。这主要是因为当饱和度和亮度过低时,计算出来的色相可能不可靠。各种颜色的HSV区间值分布在[H-10,100,100]和[H 10,255,255]之间。导入cv2
将numpy作为np导入
opencv=cv2.imread(opencv.jpg )
hsv=cv2.cvtColor(opencv,cv2。COLOR_BGR2HSV)
cv2.imshow(opencv ,opencv)
#=========指定蓝色值的范围===========
minBlue=np.array([110,50,50])
maxBlue=np.array([130,255,255])
#确定蓝色区域
mask=cv2.inRange(hsv,minBlue,maxBlue)
#通过mask控制的按位AND运算锁定蓝色区域。
blue=cv2.bitwise_and(opencv,opencv,mask=mask)
cv2.imshow(blue ,蓝色)
#=========指定绿色值的范围===========
minGreen=np.array([50,50,50])
maxGreen=np.array([70,255,255])
#确定绿色区域
mask=cv2.inRange(hsv,minGreen,maxGreen)
#通过mask控制的按位AND运算锁定绿色区域。
green=cv2.bitwise_and(opencv,opencv,mask=mask)
cv2.imshow(绿色,绿色)
#=========指定红色值的范围===========
minRed=np.array([0,50,50])
maxRed=np.array([30,255,255])
#确定红色区域
mask=cv2.inRange(hsv,minRed,maxRed)
#通过mask控制的按位AND运算锁定红色区域。
red=cv2.bitwise_and(opencv,opencv,mask=mask)
cv2.imshow(红色,红色)
cv2.waitKey()
2.cv2.destroyAllWindows()标记皮肤颜色。通过分析,可以估计出HSV颜色空间中肤色的值域值。通过滤除HSV空间中肤色范围内的值,可以提取出图像中包含肤色的部分。
导入cv2
img=cv2.imread(lesson2.jpg )
hsv=cv2.cvtColor(img,cv2。COLOR_BGR2HSV)
h,s,v=cv2.split(hsv)
最小=5
最大色调=170
hueMask=cv2.inRange(h,minHue,maxHue)
minSat=25
maxSat=166
satMask=cv2.inRange(s,minSat,maxSat)
mask=hueMask satMask
roi=cv2.bitwise_and(img,img,mask=mask)
cv2.imshow(img ,img)
cv2.imshow(ROI ,ROI)
cv2.waitKey()
2.破坏性地Windows()实现艺术效果。调整HSV颜色空间中的组件值可以生成一些有趣的效果。
将V通道的值改为255,观察图像处理结果。
导入cv2
img=cv2.imread(barbara.bmp )
hsv=cv2.cvtColor(img,cv2。COLOR_BGR2HSV)
h,s,v=cv2.split(hsv)
v[:]=255
newHSV=cv2.merge([h,s,v])
art=cv2.cvtColor(newHSV,cv2。COLOR_HSV2BGR)
cv2.imshow(img ,img)
cv2.imshow(art ,art)
cv2.waitKey()
2.在RGB色彩空间三个通道的基础上,cv2.destroyAllWindows()alpha通道还可以增加一个A通道,也叫alpha通道,表示透明。
这个四通道颜色空间称为RGBA颜色空间,PNG图像就是一个典型的四通道图像。alpha通道的赋值范围是[0,1]或[0,255],意思是从透明到不透明。
导入cv2
将numpy作为np导入
img=np.random.randint(0,256,size=[2,3,3],dtype=np.uint8)
bgra=cv2.cvtColor(img,cv2。COLOR_BGR2BGRA)
print(img=\n ,img)
打印( bgra=\n ,bgra)
b,g,r,a=cv2.split(bgra)
print(a=\n ,a)
a[:]=125
bgra=cv2.merge([b,g,r,a])
Print(BGRA=\n ,BGRa)使用语句bgra=cv2.cvtcolor (img,cv2.color _ bgr2bgra)将img从bgr色彩空间转换到BGRa色彩空间。在转换后的BGRA色彩空间中,A是alpha通道,默认值是255。
图像的alpha通道被处理
导入cv2
img=cv2.imread(lenacolor.png )
bgra=cv2.cvtColor(img,cv2。COLOR_BGR2BGRA)
b,g,r,a=cv2.split(bgra)
a[:]=125
bgra125=cv2.merge([b,g,r,a])
a[:]=0
bgra0=cv2.merge([b,g,r,a])
cv2.imshow(img ,img)
cv2.imshow(bgra ,bgra)
cv2.imshow(bgra125 ,bgra125)
cv2.imshow(bgra0 ,bgra0)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite(bgra.png ,bgra)
cv2.imwrite(bgra125.png ,bgra125)
cv2.imwrite(bgra0.png ,bgra0)
虽然每个图像的alpha通道值不同,但在显示上没有区别。
打开当前文件夹,可以看到当前文件夹下保存了三张图片,各不相同。
请注意,当图像bgra0处于预览模式时,它可能看起来像黑色图像。当你打开它,你会看到它实际上是固体和透明的。
风暴中的白杨
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。