文章目录
- 思维导图
-
- 一、实验简介
- 二、颜色空间基础
-
- [1. RGB颜色空间](#1. RGB颜色空间)
- [2. HSV颜色空间](#2. HSV颜色空间)
- [3. 为什么选择HSV空间进行颜色识别?](#3. 为什么选择HSV空间进行颜色识别?)
- 三、掩膜(Mask)的概念与制作
- [四、与运算(Bitwise AND)提取目标颜色](#四、与运算(Bitwise AND)提取目标颜色)
- 五、完整实验流程与代码逻辑
-
- [1. 读取图片](#1. 读取图片)
- [2. 转换颜色空间](#2. 转换颜色空间)
- [3. 设置颜色范围](#3. 设置颜色范围)
- [4. 生成掩膜](#4. 生成掩膜)
- [5. 与原图进行与运算](#5. 与原图进行与运算)
- [6. 显示结果](#6. 显示结果)
- 六、参数调节与实验现象
- 七、常见问题与优化建议
-
- [1. 光照影响大](#1. 光照影响大)
- [2. 图片格式不兼容](#2. 图片格式不兼容)
- [3. 识别多个颜色](#3. 识别多个颜色)
- 八、总结
思维导图

一、实验简介
在计算机视觉中,颜色识别是一项非常基础但极其重要的任务。它广泛应用于目标检测、交通标志识别、工业检测、智能驾驶等领域。
本实验将介绍如何使用OpenCV实现图片颜色识别 ,核心思想是利用颜色空间转换与**掩膜(Mask)**操作,从图像中提取目标颜色区域。
完整流程包括:
- 理解RGB与HSV颜色空间;
- 制作掩膜并进行与运算;
- 使用Python代码实现颜色识别;
- 调试参数并观察不同颜色识别效果。
二、颜色空间基础
1. RGB颜色空间
RGB是最常见的颜色模型,用三种光的强度------红(Red)、绿(Green)、蓝(Blue)来组合成各种颜色。
每个通道取值范围为0~255,因此RGB模式可以表示约1600万种颜色,几乎覆盖所有可见光颜色。
在三维坐标中,RGB模型可看作一个立方体:
- 原点(0,0,0)代表黑色;
- 对角点(255,255,255)代表白色;
- 三个轴分别对应R、G、B通道的变化。
RGB适合用于显示设备(如显示器、电视),但并不适合进行颜色分析。
原因在于------在RGB空间中调整颜色并不直观,例如想要"让红色更亮",必须同时调整R、G、B三个通道的值。
2. HSV颜色空间
为了更贴近人类对颜色的感知方式,引入了HSV(Hue, Saturation, Value)模型。
-
H(色调) :表示颜色的类型,取值范围为0°~360°,常见对应为:
红色 0°,绿色 120°,蓝色 240°。补色依次为:黄色 60°,青色 180°,紫色 300°。
-
S(饱和度) :颜色的纯度。
取值范围0%~100%,越高则颜色越鲜艳,越低则越灰暗。
-
V(明度) :颜色的亮度。
取值范围0%(黑)到100%(白),明度越高颜色越亮。
HSV的三维模型通常表示为一个六角锥体:
色调沿圆周分布,饱和度从中心向外增加,明度从底部向顶部增加。
3. 为什么选择HSV空间进行颜色识别?
在图像处理中,通常先将RGB图像转换为HSV,再对颜色进行提取。原因如下:
- 符合人类视觉习惯:HSV直接对应色调、纯度、亮度三种感知要素;
- 颜色调整更直观:只需修改色调范围即可提取指定颜色;
- 计算更高效:在颜色分割时,可以只处理H通道,大大降低复杂度。
例如,我们想提取红色区域时,只需设置H在[0,10]或[170,180]之间,而不需要计算复杂的RGB比例。
三、掩膜(Mask)的概念与制作
掩膜是图像处理中用于筛选目标区域的关键工具。
本质上它是一张二值图像,与原图尺寸相同:
- 白色(255)代表目标区域;
- 黑色(0)代表背景区域。
当我们确定了HSV颜色范围后,就可以通过cv2.inRange()函数生成掩膜。
掩膜中的白色部分就是符合颜色条件的像素。
掩膜制作的流程
- 将原图由BGR格式转换为HSV;
- 设置目标颜色的HSV阈值范围;
- 调用
cv2.inRange()生成掩膜。
【此处插入代码】
生成的掩膜是单通道图像,只有黑白两色。白色区域对应目标颜色。
四、与运算(Bitwise AND)提取目标颜色
掩膜生成后,我们需要把它与原图像进行按位与运算(bitwise AND)。
逻辑上,与运算遵循:
| 原图像像素 | 掩膜像素 | 结果像素 |
|---|---|---|
| 255 | 255 | 255 |
| 255 | 0 | 0 |
| 0 | 255 | 0 |
即:只有当掩膜对应位置为白色(255)时,原图像的像素才会保留。
OpenCV中可以使用 cv2.bitwise_and() 来实现。
【此处插入代码】
结果图像中只有目标颜色区域被保留,其他部分全部变为黑色。
五、完整实验流程与代码逻辑
1. 读取图片
首先导入必要的OpenCV和NumPy库,并读取目标图片。
python
import numpy as np
import cv2
image_np = cv2.imread('./图片路径')
2. 转换颜色空间
将图片由BGR转为HSV格式,便于后续提取颜色。
python
hsv_image_np = cv2.cvtColor(image_np,cv2.COLOR_BGR2HSV)
3. 设置颜色范围
设定需要识别的目标颜色(例如红色、蓝色或绿色)对应的HSV阈值。
HSV的H取值范围是0180(OpenCV中为半区间制),S和V通常为0255。
python
#创建hsv颜色区域的最小值数组,针对黄色区域
lowerb = np.array([26,43,46])
#创建hsv颜色区域的最大值数组,针对黄色区域
upperb = np.array([34,255,255])
4. 生成掩膜
使用 cv2.inRange() 生成二值化掩膜。
python
mask_image_np = cv2.inRange(hsv_image_np,lowerb,upperb)
5. 与原图进行与运算
通过 cv2.bitwise_and() 得到最终识别结果。
python
color_image_np = cv2.bitwise_and(image_np,image_np,mask=mask_image_np)
6. 显示结果
使用 cv2.imshow() 展示原图、掩膜、识别结果等图像。
python
cv2.imshow("color_image_np",color_image_np)
代码整合
python
#对图片中的某些目标颜色进行识别
#导入opencv的库,方便后续调用函数
import cv2
import numpy as np
#1.图片输入,准备一张原始图片
image_np = cv2.imread('./color.png')
#resize修改大小
image_np = cv2.resize(image_np,(700,700))
#2.HSV空间转换:将RGB颜色空间图像转化为HSV颜色空间的图像
hsv_image_np = cv2.cvtColor(image_np,cv2.COLOR_BGR2HSV)
#3.制作掩膜:为了方便后续遮挡其他不关心的区域,去制作一个掩膜
#创建hsv颜色区域的最小值数组,针对黄色区域
lowerb = np.array([26,43,46])
#创建hsv颜色区域的最大值数组,针对黄色区域
upperb = np.array([34,255,255])
#使用inRange,将hsv图像中的每一个值与lower和upperb进行比较
#当使用hsv图像中的像素点的hsv值处于数组范围之中,这个像素点就是我们要找的颜色
#inRange函数的作用:商城一个与原始图像大小相同的单通道图,其值要么是255,要么是0
#第一个参数:原始图像
#第二个参数:寻找范围的最小值 是个数组
#第三个参数:寻找范围的最大值 是个数组
mask_image_np = cv2.inRange(hsv_image_np,lowerb,upperb)
#4.与运算:将原始图像和原始图像进行位于运算,并使用掩膜去遮盖不关心的部分
color_image_np = cv2.bitwise_and(image_np,image_np,mask=mask_image_np)
#5.图像输出:显示结果
cv2.imshow("mask_image_np",mask_image_np)
cv2.imshow("color_image_np",color_image_np)
cv2.waitKey(0)
输出结果为:


六、参数调节与实验现象
在实验过程中,不同的HSV参数范围会影响识别效果。
通常建议:
- 红色范围:H ∈ [0,10] ∪ [170,180]
- 绿色范围:H ∈ [35,85]
- 蓝色范围:H ∈ [100,130]
可以根据实际图像进行微调,以避免光照、饱和度变化带来的偏差。
七、常见问题与优化建议
1. 光照影响大
光线变化会导致颜色识别不稳定,可通过以下方式改进:
- 在HSV空间中适当扩大H范围;
- 进行亮度归一化;
- 使用自适应阈值或颜色聚类算法(如KMeans)。
2. 图片格式不兼容
建议使用原生PNG格式图片 ,不要直接修改文件后缀。
JPEG压缩有损,会影响颜色值准确性。
3. 识别多个颜色
可以分别设置多个颜色掩膜,再将它们用 cv2.add() 合并。
八、总结
本文系统介绍了图像颜色识别的基本原理与实现方法。
从RGB到HSV的转换,让颜色的表达更贴近人类视觉;
掩膜的应用让我们能高效地定位图像中的目标颜色区域。
无论是在工业检测、交通信号识别还是自动驾驶场景中,颜色识别都是计算机视觉的重要基础。
掌握这项技术,不仅能帮助你理解图像处理的核心思想,也为后续更复杂的视觉算法打下坚实基础。