1. ISP Pipeline 全景概览:从 Sensor 到显示器的完整图像信号处理流程
各位同学,咱们今天聊聊 ISP Pipeline 的全貌。说白了,就是一张照片从 Sensor 捕捉到光线,到最后在你屏幕上显示出来,中间到底经历了什么。
我刚开始接触 ISP 时,觉得不就是调调亮度、改改颜色吗?后来踩了不少坑才明白——ISP 是一个环环相扣的精密系统,任何一个模块的参数没调好,后面再怎么补救都白搭。
1.1 为什么需要 ISP?Sensor 的“原片”有多原始?
先问一个问题:Sensor 直接输出的数据,能看吗?
答案是——基本不能。
Sensor 输出的 RAW 数据,本质上就是一个 拜耳阵列(Bayer Pattern) 的电压值。每个像素只记录了红、绿、蓝中的一种颜色,而且数值是线性的,跟人眼感知完全不同。
RAW 数据的“三宗罪”:
- 缺颜色:每个像素只有一种颜色,需要插值才能变成全彩
- 太暗/太亮:动态范围有限,高光容易过曝,暗部全是噪点
- 有噪声:Sensor 本身的热噪声、读出噪声,全在里面
所以,ISP 存在的意义就是——把 RAW 数据“翻译”成人眼看着舒服的图像。
1.2 ISP Pipeline 的完整流程
下面这张图,是我自己画的 ISP 标准流程。每个模块我都标了颜色,方便你对照着看。
嗯,这张图看着有点密,我拆开来讲。
1.3 各模块功能详解
1.3.1 黑电平校正 (Black Level Correction)
Sensor 在完全无光时,输出的值不是 0,而是某个固定偏移。这个偏移就是黑电平。校正很简单——减去这个偏移值。
我的经验:不同 Sensor 的黑电平可能随温度漂移。我曾经遇到过一个项目,白天调好的黑电平,到了晚上温度降了 10 度,画面整体偏绿。后来加了温度补偿才搞定。
1.3.2 镜头阴影校正 (Lens Shading Correction)
镜头边缘进光量比中心少,导致四周偏暗。校正方法就是——给边缘像素乘一个增益系数。
这个增益系数通常存在一个 LSC 网格表 里,每个网格点对应一个增益值。
| 网格位置 | R 增益 | Gr 增益 | Gb 增益 | B 增益 |
|---|---|---|---|---|
| 中心 (0,0) | 1.0 | 1.0 | 1.0 | 1.0 |
| 边缘 (3,3) | 1.8 | 1.7 | 1.7 | 1.9 |
| 角落 (7,7) | 2.5 | 2.3 | 2.3 | 2.6 |
1.3.3 去噪 (Noise Reduction)
Sensor 噪声主要分两种:光子散粒噪声 和 读出噪声。
- 空域去噪:双边滤波、非局部均值等,平滑噪声但保留边缘
- 时域去噪:多帧叠加,适合低光照场景
避坑指南:去噪强度不能一刀切。我曾经把去噪开得太猛,结果人脸皮肤是光滑了,但头发细节全没了,看起来像塑料假人。后来改用 边缘感知的自适应去噪,才平衡了平滑度和细节。
1.3.4 去马赛克 (Demosaic)
拜耳阵列每个像素只有一种颜色,需要插值出另外两种颜色。常用的方法有:
- 双线性插值:简单但容易产生伪彩色
- 方向自适应插值:沿边缘方向插值,减少锯齿
- 基于深度学习的插值:效果好,但算力要求高
1.3.5 白平衡 (AWB)
人眼会自动适应不同色温的光源,但 Sensor 不会。AWB 的任务就是——让白色物体在任何光源下都看起来是白的。
我习惯用 灰度世界法 做初调,再用 色温估计法 做精调。但遇到大面积单色场景(比如蓝天、绿草地),灰度世界法会翻车。这时候就得靠 统计学习模型 来兜底。
1.3.6 颜色校正矩阵 (CCM)
Sensor 的光谱响应和人眼不一样,所以需要用一个 3x3 矩阵把 Sensor 的 RGB 转换到标准色彩空间(比如 sRGB)。
// CCM 示例:将 Sensor RGB 转换到 sRGB
[R_sRGB] [ 1.8 -0.5 -0.3] [R_sensor]
[G_sRGB] = [-0.2 1.4 -0.2] [G_sensor]
[B_sRGB] [-0.1 -0.3 1.4] [B_sensor]
这个矩阵的系数,通常通过拍摄 24 色卡 来标定。
1.3.7 Gamma 校正
人眼对暗部变化更敏感,对亮部变化不敏感。Gamma 校正就是——把线性信号映射到非线性空间,让暗部细节更丰富。
标准 Gamma 曲线:V_out = V_in ^ (1/2.2)
1.3.8 色调映射 (Tone Mapping)
高动态范围(HDR)场景下,Sensor 记录的亮度范围远超显示器的显示能力。色调映射就是——把宽动态范围压缩到显示器能显示的范围内,同时保留对比度感。
1.3.9 锐化 (Sharpening)
经过前面一堆处理,图像多少会变模糊。锐化就是——增强边缘对比度,让图像看起来更清晰。
我的习惯:锐化一定要在 Gamma 之后做。如果在 Gamma 之前做锐化,暗部的噪声会被放大,亮部的边缘反而锐不起来。这个顺序我踩过坑,记住了。
1.4 模块间的交互关系
ISP 不是流水线那么简单。模块之间是 相互影响 的:
- 去噪 vs 锐化:去噪太强,锐化也救不回来细节;锐化太强,噪声会被放大
- AWB vs CCM:白平衡不准,CCM 再怎么调颜色也是偏的
- Gamma vs Tone Mapping:Gamma 是固定曲线,Tone Mapping 是动态调整,两者配合不好会导致对比度失真
所以,调 ISP 参数时,不能只盯着一个模块。我一般会先固定 AWB 和 CCM,然后调去噪和锐化的平衡,最后再微调 Gamma 和 Tone Mapping。
1.5 不同场景下的 Pipeline 差异
| 场景 | 去噪强度 | 锐化强度 | HDR 需求 |
|---|---|---|---|
| 白天户外 | 低 | 中 | 低 |
| 夜景 | 高 | 低 | 高 |
| 人像 | 中 | 低(皮肤) | 中 |
| 文档扫描 | 低 | 高 | 低 |
你看,不同场景下,每个模块的参数配置完全不同。这也是为什么 ISP 调优这么依赖经验——没有一套参数能打天下。
本章核心要点:
- ISP Pipeline 从 RAW 数据开始,经过 9 个核心模块,最终输出 YUV/RGB
- 模块之间相互影响,调参不能孤立看待
- 不同场景需要不同的参数配置,没有万能方案
- 理解每个模块的物理意义,比死记参数更重要