3、赛道识别入门:如何从图像中提取赛道区域,常见赛道颜色(白、黄、红)的阈值分割方法

无人车视觉巡线的第一步,也是最关键的一步,是从摄像头采集的原始图像中准确提取出赛道区域。无论是循迹竞速、物流配送还是教学实训,赛道识别的质量直接决定了后续速度控制与路径纠偏的成败。如果赛道区域提取错误,再优秀的控制算法也无济于事。本章将聚焦于赛道识别的入门核心——基于颜色阈值的分割方法,深入剖析白色、黄色、红色三种常见赛道颜色的提取原理、操作流程与实战调优技巧。

赛道颜色阈值分割方法对比与流程 原始图像 RGB / BGR 格式 预处理 高斯模糊 / 形态学 颜色空间转换 BGR → HSV / LAB 阈值分割 inRange 二值化 白色赛道 HSV: V高, S低 阈值: V > 200, S < 40 或 LAB: L > 200 黄色赛道 HSV: H 20~35 S > 80, V > 100 需排除白色干扰 红色赛道 HSV: H 0~10 或 170~180 S > 100, V > 80 需处理H通道环形 后处理与输出 形态学开闭运算 → 轮廓提取 → 赛道区域掩码

3.1 核心原理:为什么选择颜色阈值分割

赛道识别的本质是将图像中的像素划分为"赛道"与"非赛道"两类。在无人车视觉系统中,摄像头采集的图像通常为RGB(或BGR)格式,每个像素由红、绿、蓝三个通道的亮度值组成。然而,RGB空间对光照变化极为敏感——同一段白色赛道在强光下可能呈现为(250, 250, 250),在阴影中则可能降为(180, 180, 180),这给固定阈值分割带来了巨大挑战。

因此,工程实践中更推荐将图像转换到HSV(色相Hue、饱和度Saturation、明度Value)或LAB(亮度L、绿红通道A、蓝黄通道B)颜色空间后再进行阈值分割。HSV空间将颜色信息(H)与亮度信息(V)分离,使得我们可以仅依靠色相和饱和度来识别彩色赛道(如黄色、红色),而用明度通道识别白色赛道,从而大幅提升分割的鲁棒性。下表对比了三种常见颜色空间的适用场景:

颜色空间 通道含义 适用赛道颜色 优点 缺点
RGB/BGR 红、绿、蓝亮度 纯色、光照稳定 无需转换,计算快 光照敏感,通道耦合
HSV 色相、饱和度、明度 黄、红等彩色赛道 颜色与亮度分离,抗光照 H通道在0/180处环形
LAB 亮度、绿红、蓝黄 白色赛道、复杂光照 L通道独立,均匀感知 转换计算量稍大

3.2 判断方法与操作流程:从像素到赛道掩码

基于颜色阈值的赛道提取流程可以归纳为四个标准步骤:图像预处理 → 颜色空间转换 → 阈值分割 → 后处理优化。下面以OpenCV(Python)为例,详细拆解每一步的具体操作。

步骤一:图像预处理

原始图像往往包含噪声和细节干扰,直接进行阈值分割会产生大量孤立噪点。首先使用高斯模糊去除高频噪声,核大小通常取(5,5)或(7,7)。对于运动中的无人车,模糊还能减少振动带来的像素抖动。

import cv2
import numpy as np

# 读取图像
img = cv2.imread('track.jpg')
# 高斯模糊,去除噪声
blurred = cv2.GaussianBlur(img, (5, 5), 0)

步骤二:颜色空间转换

将BGR图像转换为HSV空间。OpenCV中cv2.cvtColor函数完成此操作。注意OpenCV的H通道范围为0~180,而标准HSV的H范围为0~360,这是为了适配8位无符号整数存储。

hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)

步骤三:阈值分割

使用cv2.inRange函数,根据赛道颜色设定HSV下界和上界,生成二值掩码。白色、黄色、红色的典型阈值范围如下表所示:

赛道颜色 H 下界 H 上界 S 下界 S 上界 V 下界 V 上界
白色 0 180 0 40 200 255
黄色 20 35 80 255 100 255
红色(低H段) 0 10 100 255 80 255
红色(高H段) 170 180 100 255 80 255
# 白色赛道掩码
lower_white = np.array([0, 0, 200])
upper_white = np.array([180, 40, 255])
mask_white = cv2.inRange(hsv, lower_white, upper_white)

# 黄色赛道掩码
lower_yellow = np.array([20, 80, 100])
upper_yellow = np.array([35, 255, 255])
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)

# 红色赛道掩码(需合并两段H范围)
lower_red1 = np.array([0, 100, 80])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 100, 80])
upper_red2 = np.array([180, 255, 255])
mask_red1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask_red2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask_red = cv2.bitwise_or(mask_red1, mask_red2)

步骤四:后处理优化

阈值分割后的掩码常包含孔洞和毛刺。使用形态学开运算(先腐蚀后膨胀)去除小噪点,再用闭运算(先膨胀后腐蚀)填充赛道内部孔洞。最后通过cv2.findContours提取赛道轮廓,为后续路径规划提供几何信息。

kernel = np.ones((5,5), np.uint8)
mask_clean = cv2.morphologyEx(mask_white, cv2.MORPH_OPEN, kernel)
mask_clean = cv2.morphologyEx(mask_clean, cv2.MORPH_CLOSE, kernel)
contours, _ = cv2.findContours(mask_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
经验提示:白色赛道在HSV中表现为高V、低S。如果赛道表面有反光,V值可能接近255,但S值也会略微上升。建议将S上界从40放宽到60,同时增加一个条件:V > 180且V - S > 120,以增强鲁棒性。

3.3 案例拆解:红色赛道识别中的H通道环形问题

红色赛道是三种颜色中最具挑战性的,因为HSV色相空间是环形的——红色同时位于H=0和H=180两端。如果只设置一个H范围(例如0~10),那么偏紫的红色(H=175)会被漏掉;如果只设置170~180,那么偏橙的红色(H=5)又无法识别。

实战场景:某高校智能车竞赛中,赛道为红色地毯,但灯光在不同区域产生色温差异。赛道在直道区域呈现纯红色(H=5),在弯道阴影区域呈现暗红色(H=175),在灯光直射区域则偏橙(H=8)。若仅使用单一H范围,识别率仅为72%。

解决方案:采用双区间合并策略,分别提取H=0~10和H=170~180两个区间的掩码,再通过cv2.bitwise_or合并。同时,将S下界从100降至80,V下界从80降至60,以覆盖阴影区域的暗红色。优化后识别率提升至96%。

关键参数调整记录:

  • 初始参数:H(0,10),S(100,255),V(80,255) → 识别率72%
  • 增加高H段:H(170,180) → 识别率88%
  • 降低S下界至80,V下界至60 → 识别率93%
  • 增加形态学闭运算(核7×7) → 识别率96%

代价与风险:降低S和V阈值会引入更多背景干扰(如深色地板、阴影边缘),需要配合更精细的形态学滤波。此外,双区间合并使计算量增加约15%,在低算力单片机上需注意帧率影响。

风险提醒:红色阈值分割中,如果背景中存在红色物体(如红色锥桶、红色围栏),会严重干扰赛道提取。建议在阈值分割后增加轮廓面积过滤——只保留面积最大的轮廓作为赛道区域,或根据赛道在图像中的预期位置(如底部中央)进行ROI裁剪。

3.4 常见误区与总结复盘

在实际工程中,初学者常犯以下错误,导致赛道识别不稳定:

  • 误区一:直接使用RGB阈值。RGB三个通道高度耦合,光照变化时三个通道同时漂移,固定阈值极易失效。正确做法是转换到HSV或LAB空间。
  • 误区二:忽略H通道的环形特性。红色和紫色在H通道两端,必须使用双区间。黄色虽然H范围较窄(20~35),但在不同光照下也可能偏移至15或40,建议适当放宽至15~40。
  • 误区三:阈值设置后不做后处理。直接使用inRange输出的掩码往往包含大量椒盐噪声,必须配合形态学操作。开运算核大小建议为赛道宽度的1/50~1/30。
  • 误区四:对所有赛道颜色使用同一套参数。白色赛道应重点看V通道,黄色和红色应重点看H和S通道。不同颜色需要独立标定阈值。

总结复盘:赛道颜色阈值分割的核心在于"选择合适的颜色空间 + 精确标定阈值范围 + 充分的后处理"。建议在开发阶段制作一个阈值调试工具,通过滑动条实时调整H/S/V上下界,并观察分割效果。下表总结了三种颜色的调试要点:

赛道颜色 首要通道 次要通道 调试优先级 常见干扰源
白色 V(明度) S(饱和度) 先调V下界,再调S上界 浅色地板、反光
黄色 H(色相) S、V 先调H范围,再调S下界 白色灯光、橙色物体
红色 H(双区间) S、V 先合并双H区间,再调S 红色背景、阴影

最后,务必在实车环境的不同时段(强光、阴天、夜间灯光)采集多组图像进行阈值验证。赛道识别的鲁棒性不是一次调参就能完成的,而是需要建立"采集样本→离线调参→实车验证→迭代优化"的闭环流程。只有将阈值分割做到稳定可靠,后续的速度控制和路径纠偏才有坚实的基础。