4. 阈值分割核心概念

阈值分割是OpenMV颜色识别项目中最基础也最关键的一步。简单来说,阈值分割就是根据像素的颜色特征,将图像中的每个像素划分为“感兴趣”和“不感兴趣”两类。在OpenMV的IDE中,我们通过调整阈值工具中的数值,让摄像头能够“看懂”哪些区域属于目标物体,哪些区域属于背景。理解阈值、单通道与多通道阈值以及LAB色彩空间的含义,是后续Blob检测和外围设备联动的基石。如果阈值设置不当,后续所有识别逻辑都会建立在错误的数据之上,导致识别不稳定甚至完全失效。

LAB阈值分割与Blob检测链路 原始图像 RGB / 灰度 LAB转换 L / A / B 三通道 阈值分割 Lmin-Lmax等6个值 二值化图像 白色=目标区域 Blob检测 连通域分析 外设联动 LED / 电机 / 蜂鸣器 LAB通道含义 L: 亮度 (0-100) 黑→白 A: 绿→红 (-128~127) B: 蓝→黄 (-128~127) 阈值 = 每个通道的最小/最大值 共6个参数组成一个阈值元组

上图展示了从原始图像到最终外设联动的完整链路。可以看到,阈值分割处于整个视觉处理流程的中间位置,它接收LAB色彩空间转换后的图像数据,输出二值化图像,供后续Blob检测使用。理解这条链路,有助于我们定位问题:当识别效果不佳时,我们需要判断是阈值设置问题、Blob参数问题,还是外设响应问题。

4.1 什么是阈值:从像素到二值化的决策边界

阈值(Threshold)在图像处理中是一个数值边界。对于灰度图像,阈值是一个0-255之间的整数;对于彩色图像,阈值则是一个多维向量。OpenMV的阈值分割操作,本质上是将每个像素的通道值与预设的阈值范围进行比较,如果落在范围内则将该像素标记为白色(255),否则标记为黑色(0)。这个过程称为二值化(Binarization),生成的图像称为二值图像或掩码(Mask)。

在OpenMV的IDE中,阈值工具提供了直观的滑块界面。当你打开“阈值编辑器”窗口时,可以看到当前画面的实时预览,以及L、A、B三个通道的直方图。通过拖动滑块,你可以设定每个通道的最小值和最大值。当所有通道的条件同时满足时,该像素才会被判定为目标像素。这种“与”逻辑关系非常重要:一个像素必须在L、A、B三个通道上都落在指定范围内,才会被保留为白色。

核心理解:阈值不是单一数值,而是一组“区间”的组合。对于LAB色彩空间,阈值由6个数值组成:(L_min, L_max, A_min, A_max, B_min, B_max)。这6个数值共同定义了一个三维空间中的长方体,所有落在这个长方体内部的颜色都会被识别为目标颜色。

阈值的选择直接影响识别效果。如果阈值范围过窄,可能会漏掉部分目标区域(欠分割),导致Blob不完整;如果阈值范围过宽,则可能将背景中的相似颜色也纳入识别范围(过分割),产生大量噪声Blob。因此,阈值调整是一个需要反复实验和观察的过程。

4.2 单通道阈值与多通道阈值:从灰度到彩色

单通道阈值适用于灰度图像或单色传感器。在OpenMV中,如果使用灰度摄像头模式,阈值编辑器只显示一个通道(灰度值)的直方图。此时阈值是一个二元组(min, max),例如(100, 255)表示提取所有亮度大于100的像素。单通道阈值计算量小、处理速度快,但只能区分亮度差异,无法区分颜色。

多通道阈值适用于彩色图像。OpenMV的彩色摄像头默认输出RGB图像,但在阈值分割时推荐使用LAB色彩空间。LAB色彩空间将颜色信息分解为三个通道:L(亮度)、A(绿-红轴)、B(蓝-黄轴)。这种分解方式更接近人类对颜色的感知,且对光照变化相对不敏感。多通道阈值需要同时设定三个通道的上下限,共6个参数。

对比维度 单通道阈值(灰度) 多通道阈值(LAB)
通道数量 1个(灰度值) 3个(L、A、B)
参数个数 2个(min, max) 6个(Lmin, Lmax, Amin, Amax, Bmin, Bmax)
颜色区分能力 只能区分亮度 可区分色相和饱和度
光照敏感性 高 较低(L通道独立)
计算开销 低 中等
适用场景 黑白物体、高对比场景 彩色物体、复杂背景

在实际项目中,如果目标物体颜色鲜明且背景简单,使用单通道阈值可能就足够了。例如,在白色传送带上识别黑色方块,灰度阈值(0, 50)就能很好地分割。但如果目标物体是红色小球,背景中有橙色或粉色的干扰物,就必须使用LAB多通道阈值,通过A通道和B通道的组合来精确锁定红色范围。

4.3 LAB阈值范围的意义:为什么选择LAB而不是RGB

RGB色彩空间是硬件直接输出的格式,但它并不适合做颜色阈值分割。原因在于RGB三个通道高度相关,且对光照变化非常敏感。例如,一个红色物体在强光下可能呈现粉红色(R高、G中、B中),在弱光下可能呈现暗红色(R中、G低、B低)。如果使用RGB阈值,很难找到一个稳定的范围来覆盖这两种情况。

LAB色彩空间将亮度(L)与颜色信息(A、B)分离。L通道只表示明暗,范围是0-100;A通道表示从绿色(负值)到红色(正值)的渐变;B通道表示从蓝色(负值)到黄色(正值)的渐变。这种分离使得我们可以在调整颜色阈值时,不受亮度变化的影响。例如,对于红色物体,A通道的值通常在20-127之间,B通道的值通常在0-127之间,而L通道可以根据实际光照条件灵活调整。

经验技巧:在OpenMV的阈值编辑器中,建议先固定L通道的较宽范围(如10-90),然后仔细调整A和B通道的范围。这样可以先锁定颜色,再微调亮度。如果目标物体在不同光照下颜色变化较大,可以适当放宽L通道的范围,但A和B通道的范围应尽量收紧,以避免误识别。

LAB阈值范围的另一个意义在于它提供了“颜色容差”的概念。每个通道的上下限之间的宽度,决定了该通道的容差大小。例如,A通道范围设为(30, 80),表示允许A值在30到80之间的所有颜色。范围越宽,容差越大,但误识别风险也越高;范围越窄,精度越高,但可能漏掉部分目标。

# OpenMV阈值元组示例
# 红色阈值(LAB)
red_threshold = (30, 90, 20, 80, 0, 60)
# 绿色阈值(LAB)
green_threshold = (30, 90, -80, -20, 0, 50)
# 蓝色阈值(LAB)
blue_threshold = (20, 80, -30, 30, -80, -20)

上述代码展示了三种常见颜色的LAB阈值。可以看到,红色和绿色的主要区别在A通道:红色A值为正,绿色A值为负。蓝色则在B通道上表现为负值。这种直观的对应关系,使得LAB阈值在调试时更容易理解和调整。

4.4 案例拆解:红色小球识别中的阈值调优

假设我们需要在OpenMV上实现一个红色小球的识别系统,用于控制舵机跟踪小球。初始场景是室内桌面,光照为普通LED灯,背景为浅灰色桌面。我们使用OpenMV Cam H7 Plus,分辨率为QVGA(320x240)。

初始现象:使用默认的红色阈值(0, 100, 20, 127, 0, 127),发现识别结果中包含了大量桌面反光区域和阴影边缘,Blob数量超过20个,且最大Blob的面积不稳定,时而大时而小。

分析过程:首先,我们怀疑是L通道范围过宽导致。桌面反光区域的L值较高(约80-95),而红色小球的L值在中等范围(约40-60)。于是我们将L通道范围调整为(30, 70),重新测试。结果发现反光区域明显减少,但阴影边缘仍然被识别。进一步观察发现,阴影边缘的A通道值在10-20之间,接近红色范围的下限。我们将A通道下限从20提高到30,同时将B通道上限从127降低到80,以排除偏紫的颜色。

实际操作步骤:

  1. 打开OpenMV IDE的阈值编辑器,加载当前画面。
  2. 勾选“LAB”色彩空间,观察直方图分布。
  3. 先用鼠标框选小球区域,查看该区域的LAB值范围。
  4. 根据框选结果,设置初始阈值:L(30, 70), A(30, 80), B(0, 60)。
  5. 运行阈值分割预览,观察二值化图像中的白色区域。
  6. 微调A通道下限至35,排除阴影边缘。
  7. 微调B通道上限至50,排除桌面上的淡黄色污渍。
  8. 最终确定阈值:(30, 70, 35, 80, 0, 50)。

结果对比:调整后,Blob数量从20+减少到2-3个,最大Blob的面积稳定在800-1200像素之间,且位置与小球实际位置吻合。舵机跟踪的响应速度明显提升,误触发率从30%降低到5%以下。

风险与代价:阈值收紧后,如果光照突然变暗,小球的L值可能低于30,导致漏检。为此,我们增加了自动曝光补偿,并定期重新校准阈值。此外,如果小球表面有高光反射,A通道值可能暂时降低,需要适当放宽A通道下限至30,以保留一定的容差。

注意事项:阈值调优不是一次性的工作。当环境光照、摄像头角度、目标物体表面状态发生变化时,原有的阈值可能失效。建议在项目中加入“校准模式”,允许用户通过按键重新采集阈值,或者使用OpenMV的自动阈值学习功能(如image.get_threshold())来动态获取阈值。

4.5 常见误区与总结复盘

在阈值分割的学习和实践中,初学者容易陷入以下几个误区:

  • 误区一:直接使用RGB阈值。RGB通道相关性高,光照变化会导致阈值失效。应始终使用LAB色彩空间进行颜色阈值分割。
  • 误区二:阈值范围越大越好。过宽的阈值会引入大量噪声,导致Blob检测不稳定。应尽量缩小阈值范围,只保留目标颜色的核心区域。
  • 误区三:忽略L通道的作用。有些同学只调整A和B通道,认为L通道不重要。实际上,L通道可以帮助排除阴影、高光等亮度异常区域。
  • 误区四:阈值设置后不再调整。环境变化后阈值需要重新校准。建议在代码中预留阈值参数,方便现场调试。
  • 误区五:混淆“阈值”与“二值化”。阈值是参数,二值化是操作。阈值分割的结果是二值图像,但阈值本身是数值范围。

总结复盘:阈值分割是OpenMV颜色识别项目的核心环节。理解阈值作为“多维决策边界”的本质,掌握单通道与多通道阈值的适用场景,熟悉LAB色彩空间的含义,是每个开发者必须掌握的基础能力。在实际项目中,阈值调优需要结合直方图观察、区域框选、实时预览和反复测试。建议每次调整只改变一个参数,观察效果后再调整下一个参数,避免多个参数同时变化导致无法定位问题。

通过本节的案例,我们看到了从“初始阈值”到“优化阈值”的完整过程。这个过程不仅涉及参数调整,还包含了对光照、背景、目标特性的综合分析。在后续的Blob检测章节中,我们将基于本节设定的阈值,进一步提取目标物体的位置、大小和方向信息,实现更高级的视觉功能。