2. ISP Pipeline 基础回顾:从 RAW 到 YUV 的关键模块

各位好,欢迎来到第二章。上一章我们聊了复杂光照场景下的挑战,说白了就是「光太乱,相机看不懂」。那相机是怎么一步步看懂世界的?这就得从 ISP Pipeline 说起。

我个人习惯把 ISP 比作一条「数字暗房」流水线。RAW 图就是刚冲洗出来的底片,又暗又偏色,还有一堆噪点。经过一个个模块处理后,才变成我们肉眼看着舒服的 YUV 图像。今天我就带大家走一遍这条流水线的核心工位。

核心认知: ISP 不是黑盒子,而是一连串数学变换。每个模块解决一个特定问题,调优就是找到这些模块之间的平衡点。
ISP Pipeline 核心模块流程 RAW 输入 BLC LSC AWB Demosaic CCM Gamma WDR YUV 输出 Gamma 和 WDR 通常在 YUV 域处理

2.1 BLC(黑电平校正)—— 把「纯黑」找回来

先说说 BLC。你想想看,传感器在完全无光的情况下,输出值并不是 0。因为电路本身有暗电流,读出来可能是 64、128 甚至更高。如果不减掉这个底数,整个画面就会发灰,暗部细节全被淹没了。

BLC 做的就是一件事:减去一个固定的偏移量。

// 伪代码示例:BLC 校正
uint16_t blc_offset = 64;  // 从暗帧统计得到
for (each pixel in RAW) {
    pixel = (pixel > blc_offset) ? (pixel - blc_offset) : 0;
}
实战技巧: 我建议 BLC 值不要只取一个固定数。不同增益下暗电流不一样,最好做一条「增益 vs BLC 偏移」的曲线。我在项目中遇到过,高增益下 BLC 没跟上,暗部直接偏紫,后来加了分段补偿才解决。

2.2 LSC(镜头阴影校正)—— 让画面亮度均匀

镜头嘛,天生就有「中心亮、四周暗」的毛病,这叫 lens shading。LSC 就是给四周像素乘一个大于 1 的增益,把亮度拉回来。

校正系数通常存成一张网格表,插值使用。嗯,这里要注意:增益不能太大,否则四周噪点会被放大到离谱。

区域 相对亮度(未校正) LSC 增益 校正后亮度
中心 1.00 1.0 1.00
0.5R 0.85 1.18 1.00
0.8R 0.70 1.43 1.00
边缘 0.55 1.82 1.00
避坑指南: 我曾经在宽动态场景下,LSC 增益设得太高,导致边缘区域 WDR 融合后出现明显的「网格状」噪声。后来我把 LSC 最大增益限制在 1.6 倍以内,配合去噪模块一起调,才压下去。

2.3 AWB(自动白平衡)—— 让白色回归白色

AWB 可能是大家最熟悉的模块了。不同色温的光源下,白色物体拍出来会偏蓝或偏黄。AWB 的目标就是找到 R/G、B/G 的比值,把色偏拉回来。

常用的方法有灰度世界法、完美反射法,还有基于色温估计的。我个人习惯用 色温曲线 + 统计反馈 的方式,稳定性更好。

// AWB 增益计算(简化版)
float R_gain = G_avg / R_avg;
float B_gain = G_avg / B_avg;
// 应用增益
R_pixel = clamp(R_pixel * R_gain, 0, 1023);
B_pixel = clamp(B_pixel * B_gain, 0, 1023);
关键点: AWB 的「收敛速度」和「稳定性」是一对矛盾。调快了画面会闪烁,调慢了场景切换半天才变过来。安防场景下,我建议优先保证稳定性,宁可慢半拍,也别让画面忽蓝忽黄。

2.4 Demosaic(去马赛克)—— 猜出缺失的颜色

传感器每个像素只能感光一种颜色(R/G/B),通过 Bayer 阵列排列。Demosaic 就是根据相邻像素,把缺失的两个颜色通道「猜」出来。

插值算法从简单的双线性插值,到方向自适应插值,再到基于深度学习的 AI 去马赛克,效果天差地别。安防场景下,我建议用 方向自适应 + 边缘保护 的算法,既能控制成本,又能减少伪色和拉链效应。

经验之谈: 我曾经在低照度场景下,用双线性插值结果全是彩色噪点。换成方向自适应后,边缘清晰度提升明显,伪色也少了很多。说白了,Demosaic 的好坏直接影响后面所有模块的效果。

2.5 CCM(色彩校正矩阵)—— 把颜色「掰」回正轨

传感器的色彩响应和人眼不一样,拍出来的红色可能偏橙,绿色可能偏黄。CCM 就是用一个 3x3 矩阵,把 RGB 颜色空间映射到标准色彩空间。

// CCM 矩阵示例(sRGB 目标)
[ R_out ]   [ 1.80  -0.45  -0.35 ] [ R_in ]
[ G_out ] = [ -0.15  1.50  -0.35 ] [ G_in ]
[ B_out ]   [ 0.05  -0.30  1.25 ] [ B_in ]

注意,CCM 矩阵的系数有正有负,负值越大,色彩越「艳丽」,但噪声也会被放大。调优时要在色彩饱和度和信噪比之间找平衡。

避坑指南: 我曾经在调试一款低端 sensor 时,为了追求色彩鲜艳,把 CCM 的负系数调得很大。结果暗部区域全是彩色噪点,怎么去噪都去不干净。后来把 CCM 的饱和度降了 15%,配合 AWB 一起调,效果反而更好。

2.6 Gamma 校正—— 让亮度符合人眼感知

人眼对暗部变化敏感,对亮部变化不敏感。而传感器是线性响应的。Gamma 校正就是做一个非线性映射,把更多的码值分配给暗部。

标准 Gamma 曲线是 V_out = V_in ^ (1/2.2)。但在安防场景下,我建议用 分段 Gamma,暗部提亮、亮部压缩,这样能保留更多细节。

2.7 WDR(宽动态)—— 亮部暗部都要看清

终于到了重头戏。WDR 解决的是「大光比」问题——窗外亮得发白,室内暗得发黑。传统做法是多帧合成:短曝光抓亮部细节,长曝光抓暗部细节,然后融合。

WDR 调优的难点在于:运动鬼影 和 噪声一致性。运动物体在长短帧中位置不同,融合后会出现重影。我一般会加运动检测和局部融合权重,把鬼影降到最低。

核心原则: WDR 不是越强越好。动态范围拉得太宽,中间调会变平,画面看起来「假」。安防场景下,我建议动态范围控制在 100dB~120dB,配合局部对比度增强,效果最自然。

2.8 模块间的依赖关系

这几个模块不是独立工作的。举个例子:

  • BLC 不准 → AWB 偏色(暗电流没减干净,统计值就偏了)
  • LSC 增益太大 → 边缘噪声爆炸 → 去噪压力大
  • CCM 饱和度过高 → WDR 融合后色彩断层
  • Gamma 提亮暗部 → 噪声被放大 → 需要更强的去噪

说白了,ISP 调优就是一场「全局博弈」。你不能只盯着一个模块调,得通盘考虑。我每次拿到新 sensor,都会先跑一遍全流程的 baseline,看看每个模块的「脾气」怎么样,再动手调。