Opencv(六) : 颜色识别

文章目录

思维导图

一、实验简介

在计算机视觉中,颜色识别是一项非常基础但极其重要的任务。它广泛应用于目标检测、交通标志识别、工业检测、智能驾驶等领域。

本实验将介绍如何使用OpenCV实现图片颜色识别 ,核心思想是利用颜色空间转换与**掩膜(Mask)**操作,从图像中提取目标颜色区域。

完整流程包括:

  1. 理解RGB与HSV颜色空间;
  2. 制作掩膜并进行与运算;
  3. 使用Python代码实现颜色识别;
  4. 调试参数并观察不同颜色识别效果。

二、颜色空间基础

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()函数生成掩膜。

掩膜中的白色部分就是符合颜色条件的像素。


掩膜制作的流程

  1. 将原图由BGR格式转换为HSV;
  2. 设置目标颜色的HSV阈值范围;
  3. 调用 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的转换,让颜色的表达更贴近人类视觉;

掩膜的应用让我们能高效地定位图像中的目标颜色区域。

无论是在工业检测、交通信号识别还是自动驾驶场景中,颜色识别都是计算机视觉的重要基础。

掌握这项技术,不仅能帮助你理解图像处理的核心思想,也为后续更复杂的视觉算法打下坚实基础。

相关推荐
HZZD_HZZD1 天前
喜讯|合众致达成功中标G312线傅家窑至苦水公路机电工程FKJD-2标水电表项目
大数据·数据库·人工智能
paixingbang1 天前
GEO优化服务商领域崛起三强 自主技术驱动AI搜索与位置智能升级
大数据·人工智能
Luhui Dev1 天前
当模型“知道自己在作弊”:Scheming 与 Reward Hacking 的技术解剖
人工智能
Elaine3361 天前
【验证码识别算法性能对比实验系统——KNN、SVM、CNN 与多模态大模型的性能博弈与机理分析】
python·opencv·支持向量机·cnn·多模态·数字图像处理
AI数据皮皮侠1 天前
全球首个30米分辨率湿地数据集(2000—2022)
大数据·人工智能
SCBAiotAigc1 天前
langchain1.x学习笔记(三):langchain之init_chat_model的新用法
人工智能·python·langchain·langgraph·deepagents
Blossom.1181 天前
联邦迁移学习实战:在数据孤岛中构建个性化推荐模型
开发语言·人工智能·python·深度学习·神经网络·机器学习·迁移学习
Blossom.1181 天前
大模型自动化压缩:基于权重共享的超网神经架构搜索实战
运维·人工智能·python·算法·chatgpt·架构·自动化
水如烟1 天前
孤能子视角:“意识“的阶段性回顾,区分“分布式智能”与“意识孤能子”标准
人工智能
KAI智习1 天前
大模型榜单周报(2026/01/10)
人工智能·大模型