一、RGB颜色空间
在图像处理中,最常见的就是RGB颜色空间。RGB颜色空间是我们接触最多的颜色空间,是一种用于表 示和显示彩色图像的一种颜色模型。RGB代表红色(Red)、绿色(Green)和蓝色(Blue),这三种 颜色通过不同强度的光的组合来创建其他颜色,广泛应用于我们的生活中,比如电视、电脑显示屏以及 上面实验中所介绍的RGB彩色图。
RGB颜色模型基于笛卡尔坐标系,如下图所示,RGB原色值位于3个角上,二次色青色、红色和黄色位于 另外三个角上,黑色位于原点处,白色位于离原点最远的角上。因为黑色在RGB三通道中表现为(0, 0,0),所以映射到这里就是原点;而白色是(255,255,255),所以映射到这里就是三个坐标为最 大值的点。
RGB颜色空间可以产生大约1600万种颜色,几乎包括了世界上的所有颜色,也就是说可以使用RGB颜色 空间来生成任意一种颜色。
二、HSV颜色空间
HSV颜色空间指的是HSV颜色模型,这是一种与RGB颜色模型并列的颜色空间表示法。RGB颜色模型使 用红、绿、蓝三原色的强度来表示颜色,是一种加色法模型,即颜色的混合是添加三原色的强度。而 HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色,色调H 表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越 高;亮度表示颜色的明暗程度,如黑色比白色亮度低。
色调H: 使用角度度量,取值范围为 0°~360°,从红色开始按逆时针 方向计算,红色为0°,绿色为 120°,蓝色为240°。它们的补 色是:黄色为60°,青色为180°, 紫色为300°。通过改变H的值, 可以选择不同的颜色
饱和度S: 饱和度S表示颜色接近光谱色的程度。 一种颜色可以看成是某种光谱色与白 色混合的结果,其中光谱色所占的比 例越大,颜色接近光谱色的程度就越 高,颜色的饱和度就越高。通常取值 范围为0%~100%,其中0%表示灰色 或无色,100%表示纯色,通过调整 饱和度的值,可以使颜色变得更加鲜 艳或者更加灰暗。
明度V: 明度表示颜色明亮的程度,对于光源 色,明度值与发光体的光亮度有关; 对于物体色,此值和物体的透射比或 反射比有关。通常取值范围为0% (黑)到100%(白),通过调整明 度的值,可以使颜色变得更亮或者更 暗。
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给 定一个严格的范围,下面是通过实验计算的模糊范围。
H: 0— 180
S: 0— 255
V: 0— 255
此处把部分红色归为紫色范围:
黑 |
灰 |
白 |
红 |
橙 |
黄 |
绿 |
青 |
蓝 |
紫 |
||
hmin |
0 |
0 |
0 |
0 |
156 |
11 |
26 |
35 |
78 |
100 |
125 |
hmax |
180 |
180 |
180 |
10 |
180 |
25 |
34 |
77 |
99 |
124 |
155 |
smin |
0 |
0 |
0 |
43 |
43 |
43 |
43 |
43 |
46 |
43 |
|
smax |
255 |
43 |
30 |
255 |
255 |
255 |
255 |
255 |
255 |
255 |
|
vmin |
0 |
46 |
221 |
46 |
46 |
46 |
46 |
46 |
46 |
46 |
|
vmax |
46 |
220 |
255 |
255 |
255 |
255 |
255 |
255 |
255 |
255 |
HSV的优点:
• 符合人类对颜色的感知方式:人类对颜色的感知是基于色调、饱和度和亮度三个维度的,而HSV颜 色空间恰好就是通过这三个维度来描述颜色的。因此,使用HSV空间处理图像可以更直观地调整颜 色和进行色彩平衡等操作,更符合人类的感知习惯。
• 颜色调整更加直观:在HSV颜色空间中,色调、饱和度和亮度的调整都是直观的,而在RGB颜色空 间中调整颜色不那么直观。例如,在RGB空间中要调整红色系的颜色,需要同时调整R、G、B三个 通道的数值,而在HSV空间中只需要调整色调和饱和度即可。
• 降维处理有利于计算:在图像处理中,降维处理可以减少计算的复杂性和计算量。HSV颜色空间相 对于RGB颜色空间,减少了两个维度(红、绿、蓝),这有利于进行一些计算和处理任务,比如色 彩分割、匹配等。
三、掩膜
掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务 的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色), 而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改
四、与运算
在图像处理领域,“与” 运算则用于对图像的像素值进行操作。具体操作是,将两张图像中所有对应像素 值逐一进行 “与” 运算,进而得到新的图像。
在 OpenCV 中,执行 “与” 运算需要两张图片。然而,在我们进行图片颜色识别时,通常只有原图像。这 种情况下,就需要将原图像自身与自身进行 “与” 运算。不过,在没有掩膜参与时,原图像自己与自己进 行 “与” 运算,结果依旧是原图像,不会产生变化。
但当掩膜参与其中,情况就不同了。掩膜是依据筛选结果制作的,掩膜中白色区域对应的就是我们要识 别的颜色。通过将掩膜覆盖到原图像上,就能掩盖不需要的部分,仅留下我们关注的部分。也就是说, 在掩膜参与的情况下,两张相同的图片(即原图像自身与自身)加上一个掩膜进行 “与” 运算,得到的结 果就是掩膜中白色部分所对应的原始图像中的颜色,这也就是颜色识别的最终结果。
具体与运算的过程如下所示:
通过与运算,我们就可以识别到目标颜色在原图中的位置。
注意:
在OpenCV中,颜色是以BGR的方式进行存储的,而不是RGB,这也是上面红色的像素值是(0, 0,255)而不是(255,0,0)的原因。
五、颜色识别
导入模块
import cv2
import numpy as np
读取图片
img=cv2.imread('red_green_blue_yello.png')
BGR转HSV
img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
创建掩膜
lowerb=np.array([26,43,46])
upperb=np.array([34,255,255])
img_mask=cv2.inRange(img_hsv,lowerb, upperb)
颜色识别
color_img=cv2.bitwise_and(img,img,mask=img_mask)
结果展示
cv2.imshow('color_img',color_img)
cv2.waitKey(0)
完整代码
# 对图片中的某些目标颜色进行识别
# 导入opencv的库,方便后续直接调用函数
import cv2
import numpy as np
img=cv2.imread('red_green_blue_yello.png')
img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 使用inRange函数,将hsv图像中的每一个值与lowerb和upperb进行比较
# 当hsv图像中的像素点的hsv值处于数组范围之内,这个像素点就是我们要找的颜色
# inRange函数的作用:生成一个与原始图像大小相同的单通道图,其值要么是255,要么是0
# 第一个参数:原始图像
# 第二个参数:寻找的范围的最小值 是个数组
# 第三个参数:寻找的范围的最大值 是个数组
lowerb=np.array([26,43,46])
upperb=np.array([34,255,255])
img_mask=cv2.inRange(img_hsv,lowerb, upperb)
# 与运算:将原始图像和原始图像进行位与操作,并使用掩膜去遮盖掉不关心的部分
color_img=cv2.bitwise_and(img,img,mask=img_mask)
cv2.imshow('img',img)
cv2.imshow('img_hsv',img_hsv)
cv2.imshow('img_mask',img_mask)
cv2.imshow('color_img',color_img)
cv2.waitKey(0)
六、库函数
6.1、inRange()
cv.inRange( src, lowerb, upperb[, dst] ) -> dst
方法 | 描述 |
---|---|
src | 图像来源 |
lowerb | 含下边界数组或标量。 |
upperb | 包含上限数组或标量。 |
dst | output 数组的大小与 src 和 CV_8U 类型相同 |
6.2、bitwise_and()
cv.bitwise_and( src1, src2[, dst[, mask]] ) -> dst
方法 | 描述 |
---|---|
src1 | 图像来源原图像 |
src1 | 图像来源原图像 |
dst | output 数组,该数组的大小和类型与 input 数组相同。 |
mask | 可选作掩码,8 位单通道数组,指定要更改的输出数组的元素。(掩膜) |