4. 图像二值化原理:全局阈值、自适应阈值(Otsu)与巡线影响
在机器人巡线任务中,摄像头采集到的原始图像通常是包含丰富灰度层次或彩色信息的RGB图像。然而,对于巡线机器人而言,真正需要关注的往往只是“地面背景”与“引导线”之间的边界。图像二值化正是将这种多值图像转化为纯黑(0)与纯白(255)二值图像的核心预处理步骤。本章将深入剖析全局阈值、自适应阈值(Otsu)等二值化算法的数学原理与工程实现,并重点讨论阈值选择如何直接影响巡线系统的鲁棒性与实时性。
4.1 二值化的核心原理与数学本质
二值化的本质是一个决策函数:对于图像中每个像素的灰度值 \( f(x,y) \),根据选定的阈值 \( T \) 将其映射为两个离散值之一。数学表达式为:
g(x,y) = 0, 若 f(x,y) < T
g(x,y) = 255, 若 f(x,y) ≥ T
这里的 \( T \) 可以是全局标量,也可以是随坐标变化的函数 \( T(x,y) \)。从信息论角度看,二值化是一个有损压缩过程——它将原本256级的灰度信息压缩为1位信息,因此阈值 \( T \) 的选择直接决定了哪些信息被保留、哪些被丢弃。在巡线场景中,理想情况是:引导线(通常为深色或浅色)被完整保留为一个连通区域,而地面背景被完全抑制。
4.2 全局阈值:固定值与Otsu自适应
4.2.1 固定全局阈值
最简单的方案是人为设定一个固定阈值 \( T \),例如 \( T=128 \)。这种方法在光照恒定、引导线与背景对比度稳定的实验室环境中表现良好。然而,一旦环境光照变化(如从室内到室外、阴影遮挡),固定阈值就会失效。例如,当阳光直射地面时,原本深色的引导线灰度值可能从80上升到160,而浅色地面的灰度值可能从200上升到240,此时固定阈值128会将引导线误判为背景。
4.2.2 Otsu自适应阈值
Otsu算法(大津法)由日本学者大津展之于1979年提出,其核心思想是最大化类间方差。算法遍历所有可能的灰度级(0~255),计算每个阈值下前景与背景的类间方差 \( \sigma_B^2 \),选择使 \( \sigma_B^2 \) 最大的阈值作为最优分割点。类间方差定义为:
σ_B² = ω_0 · ω_1 · (μ_0 - μ_1)²
其中 \( \omega_0, \omega_1 \) 分别为前景和背景像素占比,\( \mu_0, \mu_1 \) 为两类像素的平均灰度。Otsu的数学直觉是:当阈值恰好位于两个峰之间的谷底时,两类像素的灰度差异最大,类间方差达到峰值。
| 对比维度 | 固定全局阈值 | Otsu自适应阈值 |
|---|---|---|
| 计算复杂度 | O(1),直接比较 | O(256),遍历灰度级 |
| 光照适应性 | 差,需人工调整 | 较好,自动适应整体亮度变化 |
| 双峰要求 | 无 | 直方图需呈双峰分布 |
| 实时性 | 极快 | 快,适合嵌入式平台 |
| 适用场景 | 光照恒定、对比度稳定 | 光照变化但整体均匀 |
4.3 自适应阈值与局部处理
当图像存在光照不均(如一侧有阴影、另一侧强光)时,全局阈值(包括Otsu)无法同时兼顾图像不同区域的亮度差异。此时需要采用局部自适应阈值:将图像划分为若干子块(如32×32像素),对每个子块独立计算阈值。常用的局部阈值方法包括:
- 局部均值法:计算邻域内像素均值 \( m \),阈值 \( T = m - C \),其中 \( C \) 为常数偏移量。
- 局部高斯加权法:使用高斯窗口计算加权均值,对噪声更鲁棒。
- 局部Otsu:对每个子块单独执行Otsu算法,计算量较大但效果最好。
4.4 阈值选择对巡线的影响:案例拆解
下面通过一个实际巡线场景来展示阈值选择如何影响系统性能。
初始现象:当赛车经过窗户附近时,自然光照射导致地面灰度从180升至220,黑色胶带灰度从60升至90。固定阈值100将胶带灰度(90)误判为背景,导致引导线断裂,赛车冲出赛道。
分析过程:团队采集了不同光照条件下的灰度直方图,发现直方图始终呈双峰分布,但峰位随光照整体平移。因此,固定阈值无法适应这种整体亮度漂移,而Otsu算法能够自动跟踪峰谷位置。
实际操作步骤:
- 将固定阈值替换为Otsu动态阈值,核心代码如下:
# Python + OpenCV 实现
import cv2
import numpy as np
def otsu_threshold(image):
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Otsu自动计算阈值
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binary
- 在图像底部1/3区域(近视野)计算质心,作为巡线偏差信号。
- 加入形态学开运算(3×3核)去除孤立噪点。
结果对比:切换Otsu后,赛车在窗户区域的断线率从35%降至2%,平均圈速提升12%。但团队发现,当赛车进入强烈阴影区域时,Otsu仍偶尔失效——因为阴影导致局部对比度下降,直方图双峰不明显。
进一步优化:团队最终采用全局Otsu + 局部均值补偿的混合策略:先计算全局Otsu阈值 \( T_{otsu} \),再对每个32×32子块计算局部均值 \( m_{block} \),最终阈值为 \( T = T_{otsu} + (m_{block} - m_{global}) \times 0.3 \)。该方案在保持实时性的同时,有效解决了阴影问题。
4.5 常见误区与工程建议
在巡线机器人开发中,关于二值化存在以下常见误区:
- 误区一:阈值越大越好。实际上,阈值过高会导致引导线断裂,过低则引入噪声。正确做法是让阈值落在直方图谷底。
- 误区二:Otsu万能。Otsu假设直方图呈双峰分布,当引导线面积过小(如占图像<5%)或光照严重不均时,Otsu会失效。
- 误区三:忽略形态学处理。二值化后直接计算质心,容易受孤立噪点干扰。应先进行开运算(腐蚀+膨胀)去除小噪点,再进行闭运算填充引导线内部空洞。
- 误区四:过度追求局部阈值。局部阈值虽然适应性强,但计算量大,且可能将地面纹理误判为引导线。应优先优化光照条件(如加遮光罩),而非依赖复杂算法。
| 场景特征 | 推荐阈值策略 | 形态学处理 |
|---|---|---|
| 室内均匀光照 | 固定阈值或Otsu | 开运算(3×3) |
| 室外光照变化 | Otsu + 全局均值补偿 | 开运算 + 闭运算 |
| 强烈阴影/反光 | 局部自适应阈值(64×64块) | 中值滤波 + 开运算 |
| 高速巡线(帧率优先) | 固定阈值 + 手动标定 | 仅开运算(3×3) |
总结而言,图像二值化是巡线系统的“第一道关卡”,阈值选择直接决定了后续路径偏差计算的准确性。工程实践中,应遵循“先全局后局部、先简单后复杂”的原则:优先使用Otsu全局阈值,配合形态学滤波;若仍无法满足要求,再引入局部自适应机制。同时,务必在实车调试中建立阈值参数的可视化监控,以便快速定位问题。