ISP Pipeline全景:一张照片的诞生,从RAW数据到YUV/JPEG的完整流程
大家好,我是老周。今天咱们聊聊ISP Pipeline的全貌。
很多人做了好几年图像算法,却说不清一张照片到底是怎么从传感器变成屏幕上那张图的。我见过不少工程师,能把某个模块调得特别好,但一问前后级关系就含糊了。这其实挺要命的——你调黑电平的时候,想过它会影响后面的AWB吗?
所以这一章,我带你把整个Pipeline走一遍。不深究每个模块的数学细节,先把骨架搭起来。
2.1 从光子到数字:RAW数据是怎么来的
一切从传感器开始。光打在像素上,每个像素只能感知亮度,不感知颜色。那颜色怎么来的?靠滤色片阵列——最常见的就是Bayer Pattern。
我刚开始做ISP时,总觉得RAW就是“原始”的,应该最干净。后来发现不是这么回事。RAW里有大量传感器特性:暗电流、光响应非均匀性、坏点……这些不处理掉,后面全是错的。
| RAW数据特性 | 说明 | 典型问题 |
|---|---|---|
| Bayer Pattern | RGGB/GRBG等排列 | 每个像素只有单通道信息 |
| 黑电平偏移 | 传感器暗电流导致 | 暗部偏色、动态范围损失 |
| 坏点 | 像素响应异常 | 亮点/暗点,去噪前必须处理 |
| 线性响应 | RAW是线性数据 | 人眼对亮度是非线性的 |
2.2 ISP Pipeline的完整流程
好,现在RAW数据进来了。接下来就是ISP的表演时间。我把它分成三大阶段:
- 前端预处理——把RAW修干净
- 核心处理——颜色重建、降噪、锐化
- 后端输出——压缩、编码、存储
你想想看,这就像做菜。预处理是洗菜切菜,核心处理是炒菜调味,后端输出是装盘上桌。哪个环节出问题,菜都端不出去。
2.3 核心模块逐个看
下面这张图,是我自己画的ISP Pipeline全景图。建议你保存下来,后面每个章节都会用到。
2.4 前端预处理:把RAW修干净
前端预处理的目标只有一个:把传感器带来的“脏东西”去掉。我习惯按这个顺序处理:
- 黑电平校正——减去暗电流偏移,让黑色真正是黑色
- 坏点校正——检测并替换异常像素
- 镜头阴影校正(LSC)——补偿镜头边缘亮度衰减
- 增益校正——调整整体亮度到目标范围
2.5 核心处理:颜色重建与增强
核心处理是ISP的灵魂。这里我重点说几个关键模块:
2.5.1 去噪
去噪是第一步,也是最容易出问题的。去噪太强,细节没了;去噪太弱,后面放大全是噪点。我个人习惯先做空域去噪,再做时域去噪(如果有视频流)。
2.5.2 Demosaic
Demosaic就是把Bayer数据变成全彩图。说白了,就是根据周围像素猜当前像素缺失的颜色通道。算法很多,从简单的双线性插值到复杂的自适应方向插值。我建议初学者先从双线性开始,理解原理后再上复杂算法。
2.5.3 AWB
自动白平衡。这个模块调起来特别有意思——你永远不知道用户会在什么光源下拍照。我做过一个项目,用户投诉照片偏黄,结果发现是在蜡烛光下拍的。AWB算法再强,也架不住极端场景。
2.5.4 CCM
颜色校正矩阵。这个模块决定了照片的色彩风格。调CCM的时候,我建议用色卡标定,别凭感觉调。否则你会发现,红色偏橙、绿色偏黄,怎么调都调不回来。
2.6 后端输出:从线性到人眼友好
后端输出主要做三件事:
- Gamma校正——把线性数据映射到人眼感知的非线性空间
- YUV转换——从RGB转到亮度色度分离的YUV空间
- JPEG编码——压缩存储
这里有个容易忽略的点:Gamma校正的顺序。我见过有人把Gamma放在Demosaic前面,结果颜色全乱了。Gamma必须在颜色重建之后做,因为它是针对人眼感知的,不是针对传感器数据的。
2.7 总结:一张照片的诞生
好了,现在我们把整个流程串起来:
- 传感器采集RAW数据(Bayer Pattern)
- 前端预处理:黑电平校正 → 坏点校正 → LSC → 增益校正
- 核心处理:去噪 → Demosaic → AWB → CCM → Gamma校正
- 后端输出:YUV转换 → JPEG编码
- 最终输出:YUV或JPEG文件
你想想看,从光子到数字,中间经历了多少步?每一步都有算法在背后支撑。后面我们会逐个模块深入,但今天先把全景图刻在脑子里。
嗯,这一章就到这里。记住:ISP不是孤立的模块堆叠,而是一个环环相扣的系统。调任何一个参数,都要想清楚它对前后级的影响。