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的转换,让颜色的表达更贴近人类视觉;

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

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

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

相关推荐
Liudef067 小时前
基于LLM的智能数据查询与分析系统:实现思路与完整方案
前端·javascript·人工智能·easyui
芥子沫7 小时前
《人工智能基础》[算法篇3]:决策树
人工智能·算法·决策树
Y200309167 小时前
U-net 系列算法总结
人工智能·算法·目标跟踪
努力犯错8 小时前
Google Veo 3.1 提示词生成器:让 AI 视频创作效率翻倍的免费工具
人工智能·计算机视觉·语言模型·开源·音视频
SmartBrain8 小时前
深入洞察:昇腾 AI 生态的CANN/MindSpore架构
人工智能
长桥夜波8 小时前
机器学习日报09
人工智能·机器学习
Liudef068 小时前
基于Java的LLM长上下文数据预处理方案:实现128k上下文智能数据选择
java·开发语言·人工智能
数智顾问8 小时前
(108页PPT)金属加工行业智能工厂系统解决方案(附下载方式)
人工智能
TGITCIC8 小时前
通过神经网络手搓一个带finetune功能的手写数字识别来学习“深度神经网络”
人工智能·深度学习·机器学习·卷积神经网络·dnn·文字识别·识别数字