05篇
对图片进行颜色的识别与替换,主要是通过掩膜对原图像进行与运算来找到我们要识别的颜色。
因此我们需要了解如何在一张图片中寻找目标颜色、掩膜是什么以及与运算的概念。
颜色空间的理解
RGB颜色空间
在图像处理中,最常见的就是RGB颜色空间。它是一种用于表示和显示彩色图像的一种颜色模型。RGB代表红色(Red)、绿色(Green)和蓝色(Blue),这三种颜色通过不同强度的光的组合来创建其他颜色。属于三信道,也就是三位数组。
RGB颜色模型基于笛卡尔坐标系,如下图所示,RGB原色值位于3个角上,二次色青色、红色和黄色位于另外三个角上,黑色位于原点处,白色位于离原点最远的角上。因为黑色在RGB三通道中表现为(0,0,0),所以映射到这里就是原点;而白色是(255,255,255),所以映射到这里就是三个坐标为最大值的点。
RGB颜色空间可以产生大约1600万种颜色,几乎包括了世界上的所有颜色,也就是说可以使用RGB颜色空间来生成任意一种颜色。
HSV颜色空间
HSV颜色空间指的是HSV颜色模型,这是一种与RGB颜色模型并列的颜色空间表示法。
RGB颜色模型使用红、绿、蓝三原色的强度来表示颜色,是一种加色法模型,即颜色的混合是添加三原色的强度。
HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色,色调H表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越高;亮度表示颜色的明暗程度,如黑色比白色亮度低。
HSV颜色模型是一种六角锥体模型,如下图所示:
使用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°。通过改变H的值,可以选择不同的颜色
饱和度S:饱和度S表示颜色接近光谱色的程度。一种颜色可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例越大,颜色接近光谱色的程度就越高,颜色的饱和度就越高。饱和度越高,颜色就越深而艳,光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,其中0%表示灰色或无色,100%表示纯色,通过调整饱和度的值,可以使颜色变得更加鲜艳或者更加灰暗。
明度V:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白),通过调整明度的值,可以使颜色变得更亮或者更暗。
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
H: 0— 180
S: 0— 255
V: 0— 255
为什么有了RGB颜色空间我们还是需要转换成HSV颜色空间来进行图像处理呢?
符合人类对颜色的感知方式:人类对颜色的感知是基于色调、饱和度和亮度三个维度的,而HSV颜色空间恰好就是通过这三个维度来描述颜色的。因此,使用HSV空间处理图像可以更直观地调整颜色和进行色彩平衡等操作,更符合人类的感知习惯。颜色调整更加直观:在HSV颜色空间中,色调、饱和度和亮度的调整都是直观的,而在RGB颜色空间中调整颜色不那么直观。例如,在RGB空间中要调整红色系的颜色,需要同时调整R、G、B三个通道的数值,而在HSV空间中只需要调整色调和饱和度即可。降维处理有利于计算:在图像处理中,降维处理可以减少计算的复杂性和计算量。HSV颜色空间相对于RGB颜色空间,减少了两个维度(红、绿、蓝),这有利于进行一些计算和处理任务,比如色彩分割、匹配等。因此,在进行图片颜色识别时,我们会将RGB图像转换到HSV颜色空间,然后根据颜色区间来识别目标颜色。
掩膜
掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改。
与运算
"与"运算,其规则是当两个命题都是真时,其结果才为真。
而在图像处理中,“与”运算被用来对图像的像素值进行操作。具体来说,就是将两个图像中所有的对应像素值一一进行“与”运算,从而得到新的图像。
从上面的图片我们可以看出,掩膜中有很多地方是黑色的,其像素值为0,那么在与原图像进行“与”运算的时候,得到的新图像的对应位置也是黑色的,如下图所示:
通过掩膜与原图的与运算,我们就可以识别到目标颜色在原图中的位置。
注意:在OpenCV中,颜色是以BGR的方式进行存储的,而不是RGB,这也是上面红色的像素值是(0,0,255)而不是(255,0,0)的原因。
掩膜的制作运用
cv2.inRange()函数
功能
对于 src 图像中的每个像素,cv2.inRange() 函数会检查该像素的值是否位于 lowerb 和 upperb 之间(包含边界值)。如果像素值在指定范围内,则对应的输出图像 dst 中的像素值将被设置为白色(对于 uint8 图像,即值为 255)。如果像素值不在指定范围内,则对应的输出图像 dst 中的像素值将被设置为黑色(对于 uint8 图像,即值为 0)。 参数src:输入图像(通常为灰度图或单通道图像)。图像数据类型可以是 uint8 或 float32。如果是多通道图像,会分别对每个通道进行处理,但结果通常是针对单通道图像的应用。
lowerb:范围的下界。与 src 图像具有相同的类型和大小。这个参数指定了像素值范围的下限。
upperb:范围的上界。与 src 图像具有相同的类型和大小。这个参数指定了像素值范围的上限。
dst:输出图像。与 src 图像具有相同的类型和大小。如果未指定,则会自动创建一个与 src 相同大小和类型的图像来存储结果。
如下示例:
要求,对下面的红色与黄色区域进行颜色识别与替换,将其全部换成绿色
首先我们要进行红色掩膜与黄色掩膜的制作(先转换成HSV颜色空间)
一个掩膜筛选一个颜色,所以我们要制作两个掩膜,然后进行合并(或运算)
为了将目标区域给抓出来,再将掩膜与原图进行与运算,这样就能将目标区域抓出来
上面一步只为将目标抓取,进行替换时,无需对目标单独抓取出来,将获得的掩膜与原图进行对比,对相同区域进行 三信道修改 即可。结果如下:
代码演示
import cv2
import numpy as np
img = cv2.imread('image/hsb.png')
cv2.imshow('image',img)
img = cv2.resize(img,(700,700))
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
yellow_min= np.array([26,43,46])
yellow_max = np.array([34,255,255])
img_mask_1 = cv2.inRange(img_hsv,yellow_min,yellow_max)
red_min = np.array([0,43,46])
red_max = np.array([10,255,255])
img_mask_2 = cv2.inRange(img_hsv,red_min,red_max)
img_mask = cv2.bitwise_or(img_mask_1,img_mask_2)
img_mask_color = cv2.bitwise_and(img,img,mask = img_mask)
for i in range(img_mask.shape[0]):
for j in range(img_mask.shape[1]):
if img_mask[i,j] == 255:
img[i,j,:] = (0,255,0)
cv2.imshow('image_mask',img_mask)
cv2.imshow('image_mask_color',img_mask_color)
cv2.imshow('NEWimage',img)
cv2.waitKey(0)
相关知识
网址: 05篇 https://www.huajiangbk.com/newsview1094039.html
上一篇: OpenCV实验篇:识别图片颜色 |
下一篇: 机器视觉学习(六)—— 图像的颜 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039