2. ISP Pipeline 基础回顾:从 RAW 到 YUV 的关键模块
各位好,欢迎来到第二章。上一章我们聊了复杂光照场景下的挑战,说白了就是「光太乱,相机看不懂」。那相机是怎么一步步看懂世界的?这就得从 ISP Pipeline 说起。
我个人习惯把 ISP 比作一条「数字暗房」流水线。RAW 图就是刚冲洗出来的底片,又暗又偏色,还有一堆噪点。经过一个个模块处理后,才变成我们肉眼看着舒服的 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;
}
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 |
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);
2.4 Demosaic(去马赛克)—— 猜出缺失的颜色
传感器每个像素只能感光一种颜色(R/G/B),通过 Bayer 阵列排列。Demosaic 就是根据相邻像素,把缺失的两个颜色通道「猜」出来。
插值算法从简单的双线性插值,到方向自适应插值,再到基于深度学习的 AI 去马赛克,效果天差地别。安防场景下,我建议用 方向自适应 + 边缘保护 的算法,既能控制成本,又能减少伪色和拉链效应。
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 矩阵的系数有正有负,负值越大,色彩越「艳丽」,但噪声也会被放大。调优时要在色彩饱和度和信噪比之间找平衡。
2.6 Gamma 校正—— 让亮度符合人眼感知
人眼对暗部变化敏感,对亮部变化不敏感。而传感器是线性响应的。Gamma 校正就是做一个非线性映射,把更多的码值分配给暗部。
标准 Gamma 曲线是 V_out = V_in ^ (1/2.2)。但在安防场景下,我建议用 分段 Gamma,暗部提亮、亮部压缩,这样能保留更多细节。
2.7 WDR(宽动态)—— 亮部暗部都要看清
终于到了重头戏。WDR 解决的是「大光比」问题——窗外亮得发白,室内暗得发黑。传统做法是多帧合成:短曝光抓亮部细节,长曝光抓暗部细节,然后融合。
WDR 调优的难点在于:运动鬼影 和 噪声一致性。运动物体在长短帧中位置不同,融合后会出现重影。我一般会加运动检测和局部融合权重,把鬼影降到最低。
2.8 模块间的依赖关系
这几个模块不是独立工作的。举个例子:
- BLC 不准 → AWB 偏色(暗电流没减干净,统计值就偏了)
- LSC 增益太大 → 边缘噪声爆炸 → 去噪压力大
- CCM 饱和度过高 → WDR 融合后色彩断层
- Gamma 提亮暗部 → 噪声被放大 → 需要更强的去噪
说白了,ISP 调优就是一场「全局博弈」。你不能只盯着一个模块调,得通盘考虑。我每次拿到新 sensor,都会先跑一遍全流程的 baseline,看看每个模块的「脾气」怎么样,再动手调。