使用 OpenCV 在 Python 中检测相似颜色的对象

12 Apr 2025 | 8 分钟阅读

基于颜色的物体检测是一种简单的方法,它利用了目标物体独特的颜色属性来识别其在图像或视频中的位置。该过程涉及对图像进行滤波,并使用基于色调颜色的复制方法来屏蔽目标物体。

该方法通常采用 HSV(色调、饱和度、亮度)颜色空间,因为该空间将色度内容(色调)与亮度(亮度)分离开来,因此比 RGB 颜色空间更能抵御光照变化。当确定特定的 HSV 范围时,具有相似颜色的物体可以更容易地进行分割和评估。

该过程可分为以下几个步骤:

  1. 将图像从 RGB 颜色空间转换为 Float、HSV 颜色空间。
  2. 选择与目标颜色对应的 HSV 值范围。
  3. 使用 cv2.inRange() 创建掩码以隔离目标颜色。
  4. 使用掩码在原始图像中检测并突出显示物体。

什么是 HSV?

HSV 是一种图像处理和计算机视觉颜色模型,它为人类视觉提供了颜色的感知表示。与混合红色、绿色和蓝色光强度的RGB 模型不同,HSV 将颜色分量分为三个独立的部分:

  1. 色调 (H): 将颜色描述为涉及颜色类型,通常以色轮角度(0-360 度)量化。例如,红色是 0 度,绿色是 120 度,蓝色是 240 度。
  2. 饱和度 (S): 显示特定颜色的亮度或丰富程度,通常指其浓度。高饱和度会产生干净、清晰、明亮的颜色,而低饱和度会产生暗淡或类似灰色的颜色。
  3. 亮度 (V): 与颜色反射的光量有关。高亮度表示亮色,低亮度表示暗色。

理解 HSV 的不同组成部分

HSV 颜色模型包含三个组成部分:

1. 色调 (H)

色调是自然颜色本身,或称为“色调”或“阴影”,通常以圆周的角度表示,范围从 0-360 度。这是我们谈论颜色时所指的部分,在下一篇文章中,我们将讨论颜色。由于操作集中在色调上,它会过度强调您想要的特定颜色,如红色、蓝色或绿色。关于色调的另一件事是,您可以使用它来检测具有特定色调的所有物体,而不管其亮度如何。

例如

红色对应于 0°(也对应 360°)的色调,绿色对应于 120° 的色调,蓝色对应于 240° 的色调。

2. 饱和度 (S)

另一方面,饱和度与任何颜色的亮度或深度有关。如果饱和度高,颜色就具有更多的纯色调;如果饱和度低,颜色看起来就更偏灰。如果您试图寻找某种特定颜色的强烈色调,但又不像其他颜色那样鲜艳,则可以使用饱和度来查找高饱和度的颜色。

例如

  • 高饱和度:鲜艳、活泼的颜色。
  • 低饱和度:柔和或褪色的颜色。

3. 亮度 (V)

色调是颜色,它记录了颜色的亮度或暗度。其中,浮点数的较高值表示亮/浅色,较低值表示暗/暗的颜色。由于亮度代表亮度,因此它允许您在检测物体时考虑光照或阴影的变化。您可以设置亮度范围来专注于亮色或暗色,或者如果您只对检测颜色本身感兴趣,则可以忽略亮度的变化。

例如

  • 高亮度:亮色,如黄色或白色。
  • 低亮度:暗色,如深蓝色或黑色。

为什么 HSV 比 RGB 更适合颜色检测?

在图像处理和基于颜色的物体检测中,由于几个重要原因,通常首选 HSV(色调、饱和度、亮度)而不是 RGB(红、绿、蓝)。

  1. 颜色和强度分离: RGB 是一个依赖于设备的颜色模型,它使用红、绿、蓝光的强度来表示颜色。然而,在 RGB 模型的情况下,区分色调和亮度是具有挑战性的。HSV 则将颜色分成色调、强度和饱和度。这使得它能够识别颜色,而不会受到图像相对强度或光照条件的影响。这在低光照条件下尤其有用,有时物体在我们眼中看起来更亮或更暗,但我们已经知道它是某种特定颜色。
  2. 更好地与人类感知对齐: HSV 模型更符合人类感知和解释颜色的方式。虽然 RGB 以光强度(对我们来说不直观)来表示颜色,但 HSV 反映了我们描述和区分颜色的方式(例如,“一个红色的物体”,“一个绿色的苹果”)。这使得它对于颜色检测和图像分割等任务更加直观。
  3. 更轻松的颜色阈值处理: 在使用 RGB 时,定义颜色范围(例如检测“红色”)可能很复杂,因为它涉及处理红色、绿色和蓝色的不同强度。使用 HSV,您可以轻松地专注于色调分量,该分量直接对应于颜色本身,同时忽略亮度和强度的变化。这使得颜色检测的阈值设置更简单、更稳健。

在 Python 中使用 OpenCV 实现检测相似颜色的物体

在以下部分,我们将通过一个示例演示如何使用OpenCV 来检测相似颜色的物体。

代码

输出

 
Please upload an image file:
s4.jpg
s4.jpg(image/jpeg) - 22689 bytes, last modified: 1/20/2025 - 100% done
Saving s4.jpg to s4.jpg
Original image   

Detecting Objects of Similar Color in Python Using OpenCV
 
Mask (Binary)   

Detecting Objects of Similar Color in Python Using OpenCV
 
Detected Blue Objects   

Detecting Objects of Similar Color in Python Using OpenCV
 
Contours Highlighted   

Detecting Objects of Similar Color in Python Using OpenCV
 
Done!   

说明

以下是代码中过程的分步说明:

  • 上传图片:通过将要处理的图片添加到 Google Colab 环境来开始您的项目。您可以通过其文件上传功能从计算机将图片上传到 Colab。
  • 读取图像:上传图片后,Python 工具会使用 cv2.imread() 读取该图片进行处理。该函数将图片放入一个矩阵结构中,该结构存储像素值。
  • 调整图像大小:将上传的图像调整为固定的宽度和高度(600x400 像素),以标准化显示尺寸。这确保了不同尺寸的图像能够得到统一的处理和显示。
  • 将图像转换为 HSV:系统将 BGR(蓝-绿-红)颜色图像转换为 HSV(色调、饱和度、亮度)格式。HSV 系统因其将颜色光谱与光照强度分开而成为颜色物体检测的首选,从而能够独立于光照变化有效地识别颜色。
  • 定义用于检测的颜色范围:为了在图像中查找特定颜色,我们会选择一组 HSV 值。蓝色像素的精确边界范围存在于 HSV 颜色空间中。该范围指定了哪些颜色被视为“蓝色”并应被检测到。
  • 创建掩码:使用前面定义的颜色范围,创建一个二进制掩码。通过这种方法,cv2.inRange() 函数通过将给定颜色范围内的所有像素转换为 255(白色),同时将其他像素标记为 0(黑色)来创建一个着色区域。该掩码突出显示了图像中存在蓝色颜色的区域。
  • 将掩码应用于图像:使用 cv2.bitwise_and() 函数将掩码应用于原始调整大小的图像。此操作提取原始图像中对应于掩码中白色区域(已检测到的颜色区域)的区域。结果,输出图像仅显示与目标颜色匹配的物体,而图像的其余部分被黑色填充。
  • 突出显示已检测到的物体轮廓:cv2.findContours() 函数用于检测掩码中物体的边界。这些轮廓是检测到目标颜色的区域的轮廓。然后使用 cv2.drawContours() 在原始图像上以绿色绘制这些轮廓。这通过用绿色轮廓勾勒出已检测到的物体来突出它们。
  • 显示图像:在 Google Colab 中使用 cv2_imshow() 显示处理的各个阶段(原始图像、二进制掩码、检测到的颜色区域和轮廓)。此函数允许 OpenCV 图像直接在 Colab 界面中显示。

何时使用此方法有用?

该方法在目标物体具有与背景或其他物体区分开来的独特且一致的颜色时特别有用。一些常见应用包括:

  1. 追踪体育比赛中的彩色物体: 通过识别比赛场地上的颜色,轻松找到红色的足球或黄色的网球。
  2. 交通信号和标志检测: 自动驾驶汽车通过查找绿色、黄色和红色的交通信号灯颜色来识别交通信号。
  3. 工业自动化: 制造系统根据输送带上的颜色对产品进行分类。
  4. 检测医学图像中的特定区域: 我们的系统可以在小图像中找到红色和蓝色污渍,以支持医学诊断。
  5. 机器人技术中的基于颜色的分割: 现代机器人可以在混乱的环境中工作时,找到并拾取特定颜色的物体。
  6. 增强现实应用: 系统检测彩色物品,以便在其上方叠加数字特征。
  7. 环境监测: 使用卫星图像中的特定颜色范围识别受污染的水域或植被区域。
  8. 基于颜色的过滤: 通过隔离和强调特定颜色的物体来增强图像,以达到美学目的或进行进一步分析。

局限性

  1. 光照敏感性: 在光照不足或不均匀的情况下,性能可能会下降。
  2. 颜色重叠: 颜色与目标相似的物体可能会导致误报。
  3. 阴影和反射: 这些可能会影响颜色检测的准确性。