4. ISP Pipeline 深度解析:从 RAW 到 RGB 的工程博弈
ISP Pipeline,说白了就是摄像头的大脑。光从镜头进来,到最终变成你屏幕上那张能看的图,中间要过十几道关卡。我当年刚接触 ISP 时,总觉得这就是个黑盒子,直到自己动手调过几个项目,才明白每一级处理背后都是血泪。
这一章,我们就把 ISP 内部的核心模块拆开来看。重点讲清楚:每个模块在干什么、RAW 域和 RGB 域到底有什么区别、以及硬件加速和软件降噪之间怎么取舍。
4.1 ISP 整体流程概览
先给个全景图。ISP 的处理流程,大致可以分成三个阶段:
- RAW 域处理:BLC、LSC、AWB Gain、Demosaic 之前的部分
- RGB 域处理:CCM、Gamma、Color Correction
- YUV 域处理:Sharpen、NR、Chroma Enhancement
下面这张图,是我自己画的一个简化版 ISP Pipeline。你把它存下来,后面每个模块都能对应上。
4.2 核心模块逐个拆解
4.2.1 BLC(Black Level Correction)
BLC 是 ISP 的第一道工序。传感器在没有光照时,理论上输出应该是 0,但实际上会有个暗电流偏移。BLC 就是把这个偏移减掉。
我个人习惯在调试时先抓一张全黑帧,看看每个通道的 baseline 是多少。不同 sensor 的 BLC 值可能差几十个 DN(Digital Number),不校准的话,后面 AWB 和 CCM 都会偏。
4.2.2 AWB(Auto White Balance)
AWB 的目标是让白色物体在任何光源下都呈现白色。它通过统计 RAW 域中 R、G、B 通道的均值,计算出 R/G 和 B/G 的比值,然后施加增益。
这里有个坑:AWB 统计区域的选择。我曾经在一个项目中,画面里有一大片绿色植物,AWB 直接把整个画面拉偏了。后来我加了肤色检测和场景分类,才把问题解决。
4.2.3 AE(Auto Exposure)
AE 控制 sensor 的曝光时间和增益,目标是让画面亮度稳定在目标值。AE 算法通常包含三个环节:测光、统计、反馈。
我见过很多工程师只调了 AE 的 PID 参数,却忽略了 sensor 的线性区和非线性区。曝光时间太长,运动物体就会模糊;增益太高,噪声就压不住。
| AE 参数 | 影响 | 典型范围 |
|---|---|---|
| 曝光时间 | 运动模糊、亮度 | 1/10000s ~ 30s |
| 模拟增益 | 噪声、动态范围 | 1x ~ 16x |
| 数字增益 | 噪声放大 | 1x ~ 4x |
4.2.4 AF(Auto Focus)
AF 通过移动镜头位置,找到对比度最大的点。常见的 AF 算法有 Contrast AF、Phase Detection AF 和 Laser AF。
嗯,这里要注意:AF 的搜索策略。如果每次都对焦到无穷远再回来,速度会很慢。我习惯用二分法加爬山算法,先粗调再细调。
4.2.5 CCM(Color Correction Matrix)
CCM 是 RGB 域的核心模块。它用一个 3x3 矩阵把 sensor 的 RGB 色彩空间映射到标准色彩空间(如 sRGB)。
说白了,就是让红色更红、蓝色更蓝。但 CCM 的系数不能乱调。系数太大会导致色彩饱和度过高,甚至出现色块断裂。
// CCM 矩阵示例(3x3)
[ R_out ] [ 1.8 -0.5 -0.3 ] [ R_in ]
[ G_out ] = [ -0.2 1.6 -0.4 ] [ G_in ]
[ B_out ] [ -0.1 -0.3 1.4 ] [ B_in ]
4.2.6 Gamma
Gamma 校正用于补偿显示设备的非线性响应。标准 Gamma 值是 2.2。Gamma 曲线在暗部拉伸对比度,在亮部压缩对比度。
我建议在调试 Gamma 时,不要只盯着曲线看。用一张 18% 灰卡,测量输出亮度是否线性。很多 ISP 的 Gamma LUT 只有 12bit 精度,暗部会有量化误差。
4.2.7 Sharpen(锐化)
Sharpen 通过增强高频分量来提升画面清晰度。但锐化是一把双刃剑:锐化太强,边缘会出现 overshoot(白边);锐化太弱,画面发肉。
我常用的方法是:先做边缘检测,只在边缘区域做锐化,平坦区域不做。这样可以避免放大噪声。
4.3 RAW 域与 RGB 域处理差异
这个问题,面试时经常被问到。我直接给你一张对比表:
| 维度 | RAW 域 | RGB 域 |
|---|---|---|
| 数据格式 | Bayer 模式(单通道) | 三通道(R/G/B) |
| 数据量 | 低(1/3 的 RGB 数据量) | 高(3 倍于 RAW) |
| 噪声特性 | 原始噪声,未插值 | 噪声被插值放大 |
| 处理优势 | 降噪效果好,不损失细节 | 色彩校正灵活 |
| 典型模块 | BLC、LSC、AWB Gain、RAW NR | CCM、Gamma、RGB NR |
为什么 RAW 域降噪效果更好?因为 RAW 域的数据是线性的,噪声模型简单(主要是泊松噪声+高斯噪声)。而 RGB 域的数据经过了 Gamma 和 CCM,噪声变成了非线性的,更难去除。
我个人的经验是:能在 RAW 域做的事,尽量在 RAW 域做。比如降噪、坏点校正、LSC,这些在 RAW 域做效果最好,计算量也最小。
4.4 硬件加速与软件降噪的权衡
这是 ISP 架构设计中最头疼的问题。硬件加速快、功耗低,但灵活性差;软件降噪灵活、效果好,但慢、功耗高。
我画了一个决策树,帮你判断:
在实际项目中,我通常采用混合方案:
- 硬件做基础降噪:比如 2D NR、3D NR 的粗调,用 ISP 硬件模块跑,保证实时性
- 软件做精细降噪:比如 AI 降噪、多帧融合,在 AP(应用处理器)上用 GPU 或 DSP 跑
4.5 本章小结
ISP Pipeline 不是一成不变的。不同的 sensor、不同的场景、不同的功耗预算,都会影响你的架构选择。但核心原则不变:
- RAW 域优先:能早处理就早处理,避免噪声被放大
- 硬件做基础,软件做精细:用硬件保证实时性,用软件保证画质
- 调试要量化:不要凭感觉调参数,用灰卡、色卡、MTF 图来验证