3. 颜色空间基础

颜色空间是机器视觉处理中绕不开的基础概念。在OpenMV颜色识别项目中,阈值分割和Blob检测的准确性,很大程度上取决于你对颜色空间的理解深度。许多初学者在调试时发现“阈值调不准”“识别不稳定”,根源往往不是代码问题,而是对颜色模型的选择和表示方式缺乏系统认知。本章将围绕RGB、LAB、YUV三种颜色模型展开对比,并重点讲解OpenMV中如何用LAB颜色空间进行阈值设定与颜色表示。

颜色空间对比与OpenMV表示方式 RGB 颜色模型 R(0-255) G(0-255) B(0-255) 面向显示设备 通道耦合强,受光照影响大 不适合直接做阈值分割 LAB 颜色模型 L(0-100) A(-128~127) B(-128~127) 感知均匀,亮度与色度分离 OpenMV默认推荐 阈值设定直观,抗光照干扰强 YUV 颜色模型 Y(亮度) U/V(色度) 视频传输与压缩常用 OpenMV内部图像格式 需转换后使用 OpenMV 颜色表示方式 thresholds = (L_min, L_max, A_min, A_max, B_min, B_max) 使用 LAB 空间,6元组表示一个颜色阈值 支持多颜色:[(L1...), (L2...), ...] 图像采集 LAB转换 阈值分割 Blob检测

上图展示了三种颜色模型在OpenMV视觉识别链路中的定位与关系。RGB是传感器原始输出格式,LAB是OpenMV推荐的阈值分割空间,YUV则是OpenMV内部图像存储的默认格式。理解这三者之间的转换逻辑,是掌握OpenMV颜色识别的基础。

3.1 核心原理:三种颜色模型的本质与数学基础

RGB颜色模型是最贴近硬件采集原理的模型。CMOS传感器通过滤色阵列(Bayer Pattern)获取红、绿、蓝三个通道的强度值,每个通道通常用8位表示,范围0-255。RGB模型采用加法混色原理,三个通道相互叠加形成最终颜色。然而,RGB模型存在两个致命缺陷:第一,三个通道高度相关,当光照强度变化时,R、G、B三个值会同时发生非线性变化,导致同一物体在不同光照下呈现完全不同的RGB数值;第二,RGB空间不是感知均匀的,即数值上的欧氏距离与人眼感知的颜色差异不成正比。例如,深蓝色(0,0,100)和深红色(100,0,0)之间的欧氏距离与浅蓝色(100,100,200)和浅绿色(100,200,100)之间的欧氏距离相同,但人眼感知的差异却完全不同。

LAB颜色模型由国际照明委员会(CIE)于1976年制定,其设计目标就是解决RGB的感知均匀性问题。LAB空间包含三个分量:L表示亮度(Lightness),范围0-100,0为纯黑,100为纯白;A表示从绿色到红色的色度坐标,范围-128到127;B表示从蓝色到黄色的色度坐标,范围同样为-128到127。LAB空间的关键优势在于:亮度通道L与色度通道A、B完全分离,这意味着在阈值分割时,可以独立调整亮度范围而不影响色度判断。此外,LAB空间的欧氏距离与人眼感知的颜色差异高度一致,这使得阈值设定具有明确的物理意义。

YUV颜色模型起源于模拟电视广播系统,其核心思想是将亮度信息(Y)与色度信息(U、V)分离。Y分量表示亮度,U和V分量表示色差信号。YUV模型在视频压缩和传输中具有显著优势,因为人眼对亮度变化比对色度变化更敏感,因此可以对色度通道进行下采样而不影响主观画质。OpenMV的摄像头模块(如OV7725)在硬件层面直接输出YUV422格式的数据,这意味着OpenMV内部存储的图像本质上是YUV格式,只有在执行特定算法时才转换为其他颜色空间。

属性 RGB LAB YUV
通道组成 R、G、B三通道 L、A、B三通道 Y、U、V三通道
数值范围 每通道0-255 L:0-100, A/B:-128~127 Y:0-255, U/V:0-255
感知均匀性 差 优 中等
亮度与色度分离 否 是 是
OpenMV角色 传感器原始输出 阈值分割推荐空间 内部存储格式
抗光照干扰 弱 强 中等

3.2 判断方法与操作流程:OpenMV中颜色阈值设定步骤

在OpenMV中,颜色阈值设定遵循一套标准化的操作流程。首先需要明确一个核心概念:OpenMV的thresholds参数是一个六元组(L_min, L_max, A_min, A_max, B_min, B_max),分别对应LAB空间中L、A、B三个通道的最小值和最大值。当图像中某个像素的LAB值同时落在六个范围内时,该像素被判定为目标颜色。

实际操作中,推荐使用OpenMV IDE自带的阈值编辑器(Tools → Threshold Editor)进行可视化调试。该工具可以实时显示摄像头画面的LAB分量分布,并允许通过滑动条调整六个阈值参数。具体操作流程如下:

  1. 连接OpenMV摄像头,打开阈值编辑器,确保画面中有目标物体且光照条件与最终应用场景一致。
  2. 在编辑器中选择LAB颜色空间,观察目标物体在L、A、B三个通道的直方图分布。
  3. 分别调整L_min/L_max、A_min/A_max、B_min/B_max,使目标物体在二值化预览中显示为白色,背景显示为黑色。
  4. 记录最终的六元组数值,将其填入代码中的sensor.set_pixformat()和img.find_blobs()调用中。

一个常见的误区是直接使用RGB阈值进行分割。虽然OpenMV的find_blobs()函数也支持RGB阈值,但RGB空间对光照变化极其敏感。例如,一个红色球体在强光下RGB值可能为(200,50,50),在弱光下可能变为(100,25,25),虽然比例关系保持不变,但数值差异巨大,导致固定阈值无法同时覆盖两种光照条件。而LAB空间中,A通道(红绿色度)在光照变化时相对稳定,只需适当放宽L通道范围即可实现鲁棒识别。

经验提示:在设定LAB阈值时,建议先固定A和B通道的范围,再调整L通道。因为A和B通道决定了颜色的“色相”,而L通道只影响明暗。如果目标物体表面有反光或阴影,可以适当增大L通道的范围,但A和B通道的范围应尽量收紧,以避免误识别。

3.3 案例拆解:红色小球识别中的颜色空间选择

假设我们需要在OpenMV上实现一个红色小球的识别与追踪系统。项目约束条件为:摄像头固定安装,环境为室内自然光,光照强度在一天内有明显变化(上午阳光直射、下午阴天),小球表面为哑光材质,背景为白色桌面。

初始现象:使用RGB阈值进行分割时,上午阳光直射下小球识别正常,但下午阴天时小球完全无法识别。通过阈值编辑器观察发现,上午小球的RGB值约为(220,60,50),下午变为(140,40,35),两个时刻的RGB数值差异巨大,固定阈值无法同时覆盖。

分析判断过程:将图像转换到LAB空间后,发现小球的A通道值在上午和下午分别为(45,50)和(42,48),差异很小;B通道值分别为(35,40)和(33,38),同样稳定。而L通道值从上午的(55,60)变化到下午的(35,40),差异明显。这说明LAB空间成功将光照变化的影响隔离在L通道中,而色度通道A和B保持了良好的稳定性。

实际操作步骤:

import sensor, image, time

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)  # 使用RGB565格式
sensor.set_framesize(sensor.QVGA)    # 320x240分辨率
sensor.skip_frames(time=2000)

# 设定LAB阈值:L范围放宽,A/B范围收紧
red_threshold = (30, 65, 35, 55, 25, 45)

while True:
    img = sensor.snapshot()
    blobs = img.find_blobs([red_threshold], pixels_threshold=200, area_threshold=200)
    for blob in blobs:
        img.draw_rectangle(blob.rect(), color=(0, 255, 0))
        img.draw_cross(blob.cx(), blob.cy(), color=(0, 255, 0))

结果对比:改用LAB阈值后,上午和下午均能稳定识别小球。进一步测试发现,即使将小球移到窗边(光照强度骤变),识别依然正常。而使用RGB阈值时,误识别率从上午的5%上升到下午的60%以上。

风险与代价:LAB阈值虽然抗光照干扰能力强,但A和B通道的范围如果设置过窄,可能导致同色系但不同深浅的物体被漏识别。例如,深红色和浅红色在A通道上数值接近,但L通道差异较大,如果L范围过窄,可能只能识别其中一种。因此,在实际项目中需要根据目标物体的颜色分布特性,合理权衡L通道的宽容度。

复盘总结:本案例的核心经验是:当目标物体颜色单一且环境光照变化较大时,优先选择LAB空间进行阈值分割。在设定阈值时,先通过阈值编辑器观察目标物体在A、B通道的分布范围,再根据光照变化幅度调整L通道范围。如果目标物体包含多种颜色(如红蓝相间的球),则需要为每种颜色分别设定阈值,并使用find_blobs()的多阈值列表功能。

3.4 常见误区与总结复盘

误区一:直接使用RGB阈值。许多初学者从OpenCV或MATLAB转过来,习惯使用RGB阈值。但在OpenMV中,由于摄像头硬件输出YUV格式,RGB阈值需要额外的颜色空间转换,且RGB空间对光照敏感,导致阈值设定困难。正确做法是始终使用LAB空间。

误区二:忽略YUV格式的存在。OpenMV的sensor.set_pixformat()支持RGB565、GRAYSCALE、YUV422等格式。当设置为RGB565时,OpenMV内部会自动将YUV数据转换为RGB;当设置为YUV422时,图像数据直接以YUV格式存储。如果后续使用find_blobs(),OpenMV会自动将图像转换为LAB空间进行计算,但转换过程会消耗额外的CPU时间。因此,在性能敏感的应用中,可以考虑直接使用YUV格式并手动提取Y通道进行亮度相关的检测。

误区三:阈值设定过于理想化。在阈值编辑器中设定的阈值,往往是在特定光照条件下获得的。实际应用中,光照变化、物体表面反光、阴影等因素都会影响阈值效果。建议在设定阈值时,采集多个光照条件下的样本图像,取各通道数值的并集作为最终阈值范围。

误区四:忽视颜色空间的转换代价。虽然LAB空间在阈值分割中表现优异,但RGB到LAB的转换是非线性的,涉及多个数学运算。在OpenMV上,每帧图像的颜色空间转换会消耗约5-10ms的CPU时间。如果项目对帧率有严格要求(如>30fps),可以考虑降低分辨率或使用GRAYSCALE格式进行简单检测。

常见问题 原因分析 解决方案
阈值调不准 使用RGB空间,光照干扰大 切换到LAB空间,使用阈值编辑器
识别不稳定 L通道范围过窄 适当放宽L通道,收紧A/B通道
误识别率高 A/B通道范围过宽 缩小A/B范围,增加像素面积阈值
帧率下降 颜色空间转换开销大 降低分辨率,或使用YUV格式