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

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

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

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

相关推荐
冷雨夜中漫步9 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
xixixi777779 小时前
英伟达Agent专用全模态模型出击,仿冒AI智能体泛滥成灾,《AI伦理安全指引》即将落地——AI治理迎来“技术-风险-规范”三重奏
人工智能·5g·安全·ai·大模型·英伟达·智能体
直奔標竿9 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
数据皮皮侠AI9 小时前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
G31135422739 小时前
如何用 QClaw 龙虾做一个规律作息健康助理 Agent
大数据·人工智能·ai·云计算
幂律智能9 小时前
零售行业合同管理数智化转型解决方案
大数据·人工智能·零售
旺财矿工9 小时前
零基础搭建 OpenClaw 2.6.6 Win11 本地化运行环境
人工智能·openclaw·小龙虾·龙虾·openclaw安装包
九成宫9 小时前
动手学深度学习PyTorch版初步安装过程
人工智能·pytorch·深度学习
Traving Yu9 小时前
Prompt提示词工程
人工智能·prompt
NOCSAH9 小时前
统好AI CRM功能解析:智能录入与跟进
人工智能