4. ISP Pipeline深度解析

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。你把它存下来,后面每个模块都能对应上。

ISP Pipeline 核心模块流程图 ISP Pipeline 核心模块流程 RAW 域处理 BLC LSC AWB Gain Demosaic RAW NR RGB 域处理 CCM Gamma Color Correction RGB NR YUV 域处理 Sharpen YUV NR Chroma Enhancement 输出 YUV 💡 说明: RAW 域处理在 Bayer 格式上进行,数据量最小但最敏感。 RGB 域处理在 Demosaic 之后,色彩信息完整,但噪声也被插值放大。 YUV 域处理主要针对亮度和色度分离后的优化,是人眼最敏感的区域。

4.2 核心模块逐个拆解

4.2.1 BLC(Black Level Correction)

BLC 是 ISP 的第一道工序。传感器在没有光照时,理论上输出应该是 0,但实际上会有个暗电流偏移。BLC 就是把这个偏移减掉。

我个人习惯在调试时先抓一张全黑帧,看看每个通道的 baseline 是多少。不同 sensor 的 BLC 值可能差几十个 DN(Digital Number),不校准的话,后面 AWB 和 CCM 都会偏。

技巧:BLC 校准最好在 sensor 的模拟增益和数字增益都固定时做。增益一变,暗电流也会变,需要重新校准。

4.2.2 AWB(Auto White Balance)

AWB 的目标是让白色物体在任何光源下都呈现白色。它通过统计 RAW 域中 R、G、B 通道的均值,计算出 R/G 和 B/G 的比值,然后施加增益。

这里有个坑:AWB 统计区域的选择。我曾经在一个项目中,画面里有一大片绿色植物,AWB 直接把整个画面拉偏了。后来我加了肤色检测和场景分类,才把问题解决。

注意:AWB 在 RAW 域做增益,是在 Demosaic 之前。这意味着增益会同时影响亮度和色度,如果增益太大,会放大 RAW 域的噪声。

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 ]
关键点:CCM 的系数之和必须接近 1.0,否则会改变亮度。调试时可以用灰卡验证,灰卡的 R=G=B 应该保持不变。

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 架构设计中最头疼的问题。硬件加速快、功耗低,但灵活性差;软件降噪灵活、效果好,但慢、功耗高。

我画了一个决策树,帮你判断:

硬件加速 vs 软件降噪决策树 硬件加速 vs 软件降噪决策树 降噪需求 实时性要求高? 画质要求高? 硬件加速 优点:低功耗、低延迟 缺点:算法固定、难以升级 软件降噪 优点:算法灵活、效果更好 缺点:高功耗、高延迟 混合方案:硬件做基础降噪 + 软件做精细降噪

在实际项目中,我通常采用混合方案:

  • 硬件做基础降噪:比如 2D NR、3D NR 的粗调,用 ISP 硬件模块跑,保证实时性
  • 软件做精细降噪:比如 AI 降噪、多帧融合,在 AP(应用处理器)上用 GPU 或 DSP 跑
避坑指南:我曾经在一个项目中,把所有的降噪都放在硬件里做。结果发现,硬件降噪在低照度下会抹掉细节,而且无法升级。后来我改成硬件做基础降噪,软件做 AI 降噪,效果好了很多,但功耗也上去了。这就是 trade-off。

4.5 本章小结

ISP Pipeline 不是一成不变的。不同的 sensor、不同的场景、不同的功耗预算,都会影响你的架构选择。但核心原则不变:

  1. RAW 域优先:能早处理就早处理,避免噪声被放大
  2. 硬件做基础,软件做精细:用硬件保证实时性,用软件保证画质
  3. 调试要量化:不要凭感觉调参数,用灰卡、色卡、MTF 图来验证