Python----计算机视觉处理(Opencv:图片颜色识别:RGB颜色空间,HSV颜色空间,掩膜)

一、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)的原因。

五、颜色识别

导入模块

python 复制代码
import  cv2
import numpy as np

读取图片

python 复制代码
img=cv2.imread('red_green_blue_yello.png')

BGR转HSV

python 复制代码
img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

创建掩膜

python 复制代码
lowerb=np.array([26,43,46])
upperb=np.array([34,255,255])
img_mask=cv2.inRange(img_hsv,lowerb, upperb)

颜色识别

python 复制代码
color_img=cv2.bitwise_and(img,img,mask=img_mask)

结果展示

python 复制代码
cv2.imshow('color_img',color_img)
cv2.waitKey(0)

完整代码

python 复制代码
# 对图片中的某些目标颜色进行识别

# 导入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()

python 复制代码
cv.inRange(	src, lowerb, upperb[, dst]	) ->	dst
方法 描述
src 图像来源
lowerb 含下边界数组或标量。
upperb 包含上限数组或标量。
dst output 数组的大小与 src 和 CV_8U 类型相同

6.2、bitwise_and()

python 复制代码
cv.bitwise_and(	src1, src2[, dst[, mask]]	) ->	dst

| 方法 | 描述 |
| src1 | 图像来源原图像 |
| src1 | 图像来源原图像 |
| dst | output 数组,该数组的大小和类型与 input 数组相同。 |

mask 可选作掩码,8 位单通道数组,指定要更改的输出数组的元素。(掩膜)
相关推荐
一 铭39 分钟前
AI领域新趋势:从提示(Prompt)工程到上下文(Context)工程
人工智能·语言模型·大模型·llm·prompt
顾道长生'2 小时前
(Arxiv-2025)通过动态 token 剔除实现无需训练的高效视频生成
计算机视觉·音视频·视频生成
云泽野3 小时前
【Java|集合类】list遍历的6种方式
java·python·list
麻雀无能为力4 小时前
CAU数据挖掘实验 表分析数据插件
人工智能·数据挖掘·中国农业大学
时序之心4 小时前
时空数据挖掘五大革新方向详解篇!
人工智能·数据挖掘·论文·时间序列
IMPYLH5 小时前
Python 的内置函数 reversed
笔记·python
.30-06Springfield5 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
说私域6 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的超级文化符号构建路径研究
人工智能·小程序·开源
永洪科技6 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi
shangyingying_16 小时前
关于小波降噪、小波增强、小波去雾的原理区分
人工智能·深度学习·计算机视觉