首页 分享 05篇

05篇

来源:花匠小妙招 时间:2024-12-14 15:57

对图片进行颜色的识别与替换,主要是通过掩膜对原图像进行运算来找到我们要识别的颜色。

因此我们需要了解如何在一张图片中寻找目标颜色、掩膜是什么以及与运算的概念。

颜色空间的理解

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颜色模型是一种六角锥体模型,如下图所示:

色调H:

使用角度度量,取值范围为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)

相关知识

一天卖出5000万,鲜花电商迎来新生?

网址: 05篇 https://www.huajiangbk.com/newsview1094039.html

所属分类:花卉
上一篇: OpenCV实验篇:识别图片颜色
下一篇: 机器视觉学习(六)—— 图像的颜

推荐分享