4. EyeQ上的图像信号处理(ISP)流水线

EyeQ 系列芯片(如 EyeQ4、EyeQ5)内部集成了专用的图像信号处理器(ISP),它直接接收来自车载摄像头的 RAW Bayer 数据,并在片上完成从原始感光数据到可供感知网络使用的 YUV/RAW 中间表示的转换。理解这条流水线,是后续调优图像质量、保证感知算法输入一致性的基础。本节先剖析 EyeQ ISP 的架构与各处理阶段,再给出可操作的参数配置实践。

一、EyeQ ISP 的整体架构

EyeQ 的 ISP 位于 MIPI CSI-2 接收端口与下游视觉加速器(如 PMA、VMP 或 EyeQ5 的 CNN 加速器)之间,是一条硬件流水线。数据从摄像头经 CSI-2 进入后,依次经过黑电平校正、镜头阴影校正、坏点校正、去马赛克、降噪、白平衡、色彩校正、伽马与色调映射,最后输出到内存或直接送入感知模块。整条链路以行为单位流式处理,延迟以若干行计,因此对实时性友好。

与通用 SoC 的 ISP 不同,EyeQ 的 ISP 参数通常由 Mobileye 提供的工具链(如 EyeQ 的 ISP tuning 工具)生成一组寄存器配置,在系统启动或摄像头切换时加载。开发者一般通过 SDK 提供的接口读写这些参数,而不是逐寄存器手工配置。理解每个阶段的作用,才能判断该调哪个参数。

EyeQ 内置 ISP 流水线(RAW → YUV) 车载摄像头 RAW Bayer 10/12bit MIPI CSI-2 接收端口 黑电平校正 BLC 镜头阴影校正 LSC 坏点校正 DPC 去马赛克 Demosaic 降噪 NR / 3DNR 自动白平衡 AWB 色彩校正 CCM 伽马 / 色调 Gamma / TM 锐化 / 边缘增强 Sharpen YUV / RGB 输出至感知模块 ISP 参数配置接口(SDK / Tuning Tool) BLC 偏移 · LSC 增益表 · DPC 阈值 · NR 强度 · AWB 增益 · CCM 3×3 矩阵 · Gamma 曲线

二、RAW 数据处理与去马赛克

摄像头传感器输出的是每个像素只有一种颜色分量的 Bayer 阵列,常见排列为 RGGB、BGGR、GRBG、GBRG 四种。EyeQ ISP 首先做黑电平校正(BLC):传感器在完全无光时仍有非零输出,典型值在 10bit 下约为 64 LSB。BLC 从每个像素减去该偏移,使暗部归零。若偏移设得偏小,暗部会残留灰底;设得偏大,则暗部被截断丢失细节。

接着是镜头阴影校正(LSC)。由于镜头边缘进光量低于中心,画面四角会偏暗。LSC 使用一张与分辨率对应的增益表,对每个位置乘以大于 1 的增益。增益表通常按网格(如 17×13 个节点)存储,节点之间双线性插值。校正不足则四角仍暗,过度则四角出现噪点放大。

坏点校正(DPC)检测与邻域差异过大的像素并替换。EyeQ 支持静态坏点表与动态检测两种方式。阈值过小会误伤真实边缘,过大则漏掉坏点。

去马赛克(Demosaic)把 Bayer 数据插值为每个像素都有 R、G、B 三通道。EyeQ 采用边缘自适应插值:在绿色通道上先重建,再依据水平与垂直方向的梯度选择插值方向,从而减少高频区域的伪彩。伪彩和拉链效应是这一阶段最典型的缺陷,通常通过调整边缘判定阈值来抑制。

三、降噪、白平衡与色彩校正

降噪分两步:去马赛克前对 RAW 做降噪,去马赛克后对 YUV 做降噪。RAW 域降噪保留更多细节,YUV 域降噪则更易控制色噪。EyeQ 的 3DNR 还会利用前后帧信息,对静态场景大幅降噪,但运动物体可能产生拖影,因此需要配合运动检测阈值。

自动白平衡(AWB)估计场景色温并调整 R、G、B 增益,使白色物体在不同光源下仍呈白色。EyeQ 的 AWB 通常基于灰世界或色温曲线统计。增益配置不当会导致画面偏蓝(色温估计偏高)或偏黄(偏低)。

色彩校正矩阵(CCM)是一个 3×3 矩阵,把传感器 RGB 空间转换到标准 sRGB 空间,补偿滤色片的光谱偏差。CCM 系数之和通常归一化为 1,以保持亮度。矩阵偏离过大时,饱和色会出现明显偏色。

最后是伽马校正与色调映射,把线性响应映射到符合人眼感知的非线性曲线,并压缩高动态范围。锐化则在末尾增强边缘,强度过高会产生白边和噪点放大。

四、ISP 参数配置实践

下面以一段伪代码示例说明如何通过 SDK 加载一组 ISP 参数。参数值属于教学示例,实际应以具体摄像头模组和 EyeQ 型号的标定结果为准。

// 示例:加载 ISP 配置(参数为教学示例值)
isp_config_t cfg;

// 黑电平校正:10bit 下偏移 64
cfg.blc.offset_r = 64;
cfg.blc.offset_gr = 64;
cfg.blc.offset_gb = 64;
cfg.blc.offset_b = 64;

// 镜头阴影校正:启用 17x13 增益表
cfg.lsc.enable = 1;
cfg.lsc.grid_w = 17;
cfg.lsc.grid_h = 13;
// 增益表由标定工具生成,中心约 1.0,四角约 1.6

// 坏点校正
cfg.dpc.enable = 1;
cfg.dpc.threshold = 30;   // 与邻域差异超过 30 LSB 判为坏点

// 降噪
cfg.nr.raw_strength = 0.4f;   // RAW 域降噪强度 0~1
cfg.nr.yuv_strength = 0.6f;   // YUV 域降噪强度
cfg.nr.temporal_enable = 1;   // 开启 3DNR
cfg.nr.motion_threshold = 15; // 运动检测阈值

// 白平衡:示例增益(日光约 5500K)
cfg.awb.gain_r = 1.85f;
cfg.awb.gain_g = 1.00f;
cfg.awb.gain_b = 1.55f;

// 色彩校正矩阵(示例,行和归一化为 1)
cfg.ccm[0] = 1.60f; cfg.ccm[1] = -0.45f; cfg.ccm[2] = -0.15f;
cfg.ccm[3] = -0.25f; cfg.ccm[4] = 1.45f; cfg.ccm[5] = -0.20f;
cfg.ccm[6] = 0.05f; cfg.ccm[7] = -0.35f; cfg.ccm[8] = 1.30f;

// 伽马:标准 sRGB 近似
cfg.gamma.enable = 1;
cfg.gamma.curve = GAMMA_SRGB;

// 锐化
cfg.sharpen.enable = 1;
cfg.sharpen.strength = 0.5f;

isp_apply_config(&cfg);

配置完成后,如何判断图像质量是否达标?可以从以下几个可观察的指标入手:

  • 暗部灰底:遮住镜头拍摄全黑画面,若仍有可见灰底,说明 BLC 偏移偏小;若暗部细节全黑,则偏移偏大。
  • 四角亮度:拍摄均匀白墙,比较中心与四角亮度,差异应小于约 10%。
  • 伪彩与拉链:拍摄高频黑白条纹,观察边缘是否出现彩色条纹,据此调整去马赛克边缘阈值。
  • 色偏:在日光与白炽灯下拍摄白纸,检查 R、G、B 均值是否接近,偏差大则调整 AWB 增益或 CCM。
  • 噪点与拖影:弱光下观察静态区域噪点,同时拍摄运动物体检查拖影,平衡降噪强度与运动阈值。
调参建议按流水线顺序逐级进行:先 BLC 与 LSC,再 DPC 与去马赛克,然后 AWB 与 CCM,最后降噪、伽马与锐化。前级未调好时,后级参数往往是在补偿前级缺陷,容易顾此失彼。
ISP 参数与摄像头模组、镜头、光源强相关。更换模组后必须重新标定 LSC 增益表与 CCM 矩阵,直接沿用旧参数通常会导致四角偏暗和明显色偏。

掌握这条流水线后,开发者就能在感知算法输入异常时,快速判断问题出在 ISP 的哪个阶段,并有针对性地调整参数,而不是盲目试错。