4. 道路场景图像预处理

EyeQ 芯片上的车道线与可行驶区感知,前端输入通常来自安装在前挡风玻璃后的单目摄像头,输出为 YUV 或 RAW 格式的 Bayer 图像。原始图像在进入 CNN 或传统特征提取之前,必须经过一轮“轻量但关键”的预处理。这一章讨论的不是通用图像美化,而是面向 EyeQ 实时约束(典型帧率 30fps、单帧预算约 33ms、片上内存与带宽有限)的预处理链路设计。

一、去噪:先判断噪声类型,再选滤波器

车载摄像头在夜间高 ISO 增益下,噪声以高斯噪声与椒盐噪声混合形式出现。工程上不建议直接上非局部均值(NLM)或 BM3D,因为它们的计算量在 EyeQ 上不可接受。实际做法是:

  • 高斯噪声:使用 3×3 或 5×5 的可分离高斯核,σ 取 0.8~1.2。可分离卷积把 5×5 的 25 次乘加降为 10 次,对 EyeQ 的 SIMD 单元非常友好。
  • 椒盐噪声:先做 3×3 中值滤波,但中值滤波对细车道线有腐蚀风险,因此只在亮度通道 Y 上做,且仅对疑似噪声点(与邻域均值偏差超过阈值 T=40)执行。
  • 时域去噪:利用相邻帧对齐后的加权平均,权重 α 取 0.3~0.5,可显著抑制随机噪声,但需注意运动物体拖影。

一个可参考的示例参数:在 1280×720 输入下,3×3 高斯 + 条件中值,单帧耗时约 1.2ms(EyeQ4 实测量级,具体以实际平台为准)。

二、对比度增强:CLAHE 的裁剪与分块

逆光、隧道出口、树荫交替是车道线检测最头疼的场景。全局直方图均衡会放大暗区噪声,因此采用限制对比度自适应直方图均衡(CLAHE)。关键参数:

  • 分块数:8×8,块太小会放大噪声,块太大则局部适应性不足。
  • 裁剪阈值 clipLimit:2.0~3.0,超过阈值的直方图部分均匀分配到各灰度级。
  • 插值:块间采用双线性插值,避免块边界出现明显接缝。

CLAHE 只在 Y 通道执行,色度通道 U/V 保持原样,避免颜色失真。若在 EyeQ 上实现,可先对 Y 做 8×8 分块直方图统计,再用查表方式完成映射,整体耗时约 2~3ms。

三、逆光与阴影处理:分区域增益与形态学

逆光场景下,天空区域过曝、路面欠曝。直接全局 gamma 校正无法兼顾。工程做法是:

  1. 用亮度阈值(如 Y > 200)分割出高亮区域,用 Y < 50 分割出暗区。
  2. 对暗区做局部 gamma 提升(γ=0.7),对高亮区做压缩(γ=1.3),中间区域保持线性。
  3. 阴影边界用形态学开运算(3×3 结构元)平滑,避免增益突变产生伪边缘。

注意:逆光处理会改变图像整体亮度分布,后续 ROI 裁剪和金字塔构建必须使用处理后的图像,否则车道线对比度判断会失准。

四、ROI 裁剪:把算力花在路面上

车道线只出现在图像下半部分。以 1280×720 为例,ROI 通常取 y ∈ [360, 720],x ∈ [160, 1120],即下半部中间区域。裁剪后面积约为原图的 40%,直接减少后续 CNN 约 60% 的卷积计算量。

ROI 不是固定矩形,而是随车速和转向动态调整的梯形:车速越高,ROI 上边界越靠上(更远视野);转向时,ROI 向弯道内侧偏移。EyeQ 上可用简单的透视变换矩阵实现梯形裁剪,避免逐像素判断。

五、多尺度金字塔:兼顾近处细节与远处结构

车道线在近处宽、远处窄,单一尺度难以同时检测。构建 3 层高斯金字塔:

  • Level 0:原始 ROI,1280×360,用于近处车道线边缘。
  • Level 1:下采样 2 倍,640×180,用于中距离车道线。
  • Level 2:下采样 4 倍,320×90,用于远处车道线走向和消失点估计。

金字塔构建本身可用 5×5 高斯核 + 隔行隔列采样,每层耗时约 0.5ms。注意:金字塔必须在 ROI 裁剪之后构建,否则会浪费算力在无关区域。

EyeQ 道路场景预处理链路(单帧预算约 33ms) 摄像头输入 YUV / RAW Bayer 去噪 3×3高斯+条件中值 对比度增强 CLAHE 8×8 clip=2.5 逆光/阴影处理 分区域gamma+形态学 ROI 裁剪 梯形动态区域 多尺度金字塔构建 Level 0 1280×360 Level 1 640×180 Level 2 320×90 近处细节 → 中距结构 → 远处走向 输出至车道线/可行驶区网络 多尺度特征图 + 增强ROI 单帧耗时预算(示例) 去噪 ~1.2ms CLAHE ~2.5ms 逆光/阴影 ~1.5ms ROI裁剪 ~0.3ms 金字塔 ~1.5ms 合计约 7ms,占单帧预算 21% 实时性优化要点: ① 所有滤波仅在 Y 通道执行,色度通道直通;② CLAHE 用查表替代逐像素计算;③ ROI 裁剪先于金字塔,减少 60% 无效卷积; ④ 金字塔层数不超过 3 层,避免带宽瓶颈;⑤ 逆光/阴影处理与 CLAHE 共享直方图统计,减少重复读取。

六、面向 EyeQ 实时性的预处理优化策略

上述五步如果串行执行,在 EyeQ4 上约 7ms,占 33ms 预算的 21%,看似宽裕,但车道线网络本身可能占用 15~20ms,因此预处理仍需精打细算。几条经过验证的策略:

  • 通道分离:所有预处理只在 Y 通道做,U/V 直接下采样后送入网络,节省约 40% 带宽。
  • 查表替代实时计算:CLAHE 的映射函数、gamma 曲线都预先算成 256 项 LUT,运行时只做查表。
  • ROI 先行:先裁剪再滤波,滤波面积减少 60%,去噪和 CLAHE 的耗时同步下降。
  • 金字塔与 ROI 联动:Level 1 和 Level 2 直接从 ROI 下采样,不保留全图金字塔。
  • 跳过策略:当帧间亮度变化小于阈值(如平均 Y 变化 < 5)时,跳过 CLAHE 和逆光处理,直接复用上一帧的 LUT。
工程提示:预处理链路中的每一步都会改变图像的统计特性。调试时建议在每一步后保存中间图(Y 通道伪彩色),观察车道线边缘是否被过度平滑、暗区噪声是否被放大、ROI 是否切掉了远处车道线。EyeQ 的调试工具通常支持逐级 dump,这是定位预处理问题的第一手依据。
常见误区:把 CLAHE 的 clipLimit 设得过高(如 >4.0),虽然暗区车道线更明显,但路面纹理和噪声也会被同步放大,导致后续边缘检测出现大量伪边缘。建议在夜间和逆光场景下分别标定 clipLimit,取两者中较保守的值。

总结来说,EyeQ 上的预处理不是“把图像变好看”,而是在有限算力下,把车道线和可行驶区最需要的对比度、尺度、区域信息保留下来,同时把无关区域和噪声压下去。去噪、CLAHE、逆光阴影、ROI、金字塔这五步的顺序和参数,必须围绕“车道线在哪个尺度、哪个区域、以什么对比度出现”来设计,而不是照搬通用图像处理流程。