ISP流水线概览:从RAW到RGB/YUV的完整流程
好,咱们正式开始聊ISP流水线。很多刚入行的朋友拿到RAW图,第一反应就是——这玩意儿灰蒙蒙的,怎么调都像没睡醒。别急,这就是RAW的本来面目。ISP流水线说白了,就是一套把「半成品」RAW数据,加工成「成品」RGB或YUV图像的工序链。
我习惯把ISP比作一个厨房。RAW是刚洗好的菜,RGB/YUV是端上桌的菜。中间要经过切、焯、炒、调味、摆盘。每一道工序都有讲究,顺序错了或者火候过了,菜就毁了。
核心认知: ISP不是单一步骤,而是一条流水线。每个模块的输出,是下一个模块的输入。模块之间的顺序和参数耦合,决定了最终图像质量。
2.1 流水线整体框架
先看一张整体流程图。我画了这么多年框图,这张图的结构几乎没变过——因为CMOS传感器的物理特性决定了处理顺序。
这张图我建议你存下来。每次调试遇到问题,先回到这张图,问自己:问题出在第几个环节?
2.2 各模块功能简介
下面我把每个模块拆开聊。不追求一次讲透,先建立整体印象。
2.2.1 预处理阶段(RAW域)
这个阶段的操作全部在RAW域完成,数据还是Bayer格式。说白了,就是先把传感器原始信号「洗干净」。
| 模块 | 功能 | 我的经验 |
|---|---|---|
| 黑电平校正 | 减去传感器暗电流引入的固定偏置 | 不同增益下黑电平会漂移,我习惯做分段校正 |
| 镜头阴影校正 | 补偿镜头中心到边缘的光衰减 | 广角镜头阴影特别重,校正系数要实测 |
| 坏点校正 | 检测并替换死点/亮点 | 动态坏点检测容易误判,我一般先做静态标定 |
| 去噪 | 降低传感器读出噪声 | RAW域去噪比RGB域效果好,但算力开销大 |
注意: 预处理阶段的参数一旦设错,后面所有模块都会跟着错。我曾经在一个项目里把黑电平设偏了10个DN,结果白平衡怎么调都偏色,查了三天才发现是黑电平的问题。
2.2.2 色彩重建阶段(RAW→RGB)
这个阶段的核心任务,是把Bayer格式的RAW数据,变成全彩的RGB图像。嗯,这里要注意,去马赛克是ISP里最「玄学」的模块之一。
- 自动白平衡(AWB): 估计场景色温,调整R/G/B增益。我见过很多新手直接套用D65的固定白平衡,结果在室内暖光灯下拍出来一片惨蓝。AWB一定要做场景自适应。
- 去马赛克(Demosaic): 从Bayer阵列插值出每个像素的R/G/B值。插值算法直接影响分辨率和伪色。简单双线性插值速度快但边缘有锯齿,自适应插值效果好但计算量大。怎么选?看你的硬件算力。
2.2.3 色彩与色调调整阶段(RGB域)
到了RGB域,图像已经有了颜色,但还不够「好看」。这个阶段就是调色。
| 模块 | 功能 | 典型参数 |
|---|---|---|
| 色彩校正矩阵(CCM) | 将传感器RGB映射到标准色彩空间 | 3×3矩阵系数 |
| Gamma校正 | 非线性映射,适配显示设备 | Gamma值(通常2.2) |
| 色调映射 | 压缩动态范围,保留细节 | 映射曲线/局部对比度 |
小技巧: CCM的调试我建议用24色卡。先拍一张RAW,然后在标准光源下标定。别偷懒用网上找的通用矩阵——每个传感器的光谱响应都不一样。
2.2.4 后处理阶段(RGB/YUV域)
最后一步,提升视觉体验。说白了就是「美颜」。
- 锐化: 增强边缘对比度,让图像看起来更清晰。但锐化过度会产生光晕(halo),我一般控制在1.2倍以内。
- 色彩增强: 提升饱和度、调整色相。这里有个坑——增强过度会导致肤色失真。我曾经调一个安防摄像头,把红色通道增益拉太高,结果人脸拍出来像关公。
2.3 流水线的数据流与格式转换
整个流水线中,数据格式会经历多次变化。我整理了一张表,方便你对照。
| 阶段 | 数据格式 | 位深 | 说明 |
|---|---|---|---|
| 传感器输出 | Bayer RAW | 10/12/14 bit | 每个像素只有一种颜色 |
| 预处理后 | Bayer RAW | 10/12/14 bit | 格式不变,数据已校正 |
| 去马赛克后 | RGB | 12/16 bit | 每个像素有完整RGB |
| Gamma校正后 | RGB | 8/10 bit | 非线性映射,位深可能降低 |
| 最终输出 | RGB/YUV | 8/10 bit | YUV用于视频编码 |
为什么最后要转YUV?因为人眼对亮度敏感、对色度不敏感。YUV可以把色度分量降采样,节省带宽。做视频传输的项目,这一步几乎是标配。
2.4 流水线调试的通用原则
聊完模块,说说调试思路。我总结了三条原则,算是这些年踩坑踩出来的。
- 从前往后调: 先调RAW域,再调RGB域。前面的问题没解决,后面调得再好也没用。我见过有人花两周调色彩,结果发现是黑电平没校好——白费功夫。
- 单变量原则: 每次只改一个模块的参数。改完看效果,记录前后对比。别同时调AWB和CCM,出了问题你根本不知道是谁的锅。
- 用客观指标辅助主观评价: 人眼会骗人。我习惯同时看PSNR、SSIM、色差ΔE。主观觉得「好看」不一定准,指标不会说谎。
一句话总结: ISP流水线不是魔法,是一套有逻辑的工序链。理解每个模块「为什么放在这个位置」,比记住参数更重要。