图像数据管道:从RAW图到可显示图像
图像数据管道,说白了就是相机从「看到」到「输出」的全过程。我最早接触这块时,以为就是传感器拍下来直接显示——太天真了。实际上,传感器输出的RAW数据离我们能看的图像,中间差了整整一条ISP流水线。
这一章,咱们就从头捋一遍。从RAW图格式、Bayer阵列,到去马赛克,再到ISP流水线的基本框架。这些都是后面3A算法的基础,绕不开。
RAW图数据格式:传感器的「原始供词」
传感器每个像素只能感知光的强度,不区分颜色。那彩色是怎么来的?答案是在传感器表面覆盖一层彩色滤光片阵列(CFA),最常见的就是Bayer阵列。
RAW图就是传感器直接输出的、未经任何处理的数字信号。每个像素只记录一个颜色通道的值——要么R,要么G,要么B。格式上通常是12bit或14bit,比最终8bit图像细腻得多。
关键点:RAW图不是「灰图」,也不是「彩图」,它是「马赛克图」。每个像素只有一种颜色信息,另外两种颜色需要靠插值算出来。
我遇到过不少新手,拿到RAW数据直接当灰度图显示,结果发现图像暗部细节全丢了。其实RAW的线性空间和显示用的gamma空间完全不同,直接显示肯定不对。
Bayer阵列:最常见的CFA模式
Bayer阵列的排列是:一行RGRG,下一行GBGB,交替重复。为什么绿色像素占一半?因为人眼对绿色最敏感。这个设计很聪明——用更多的绿色像素模拟人眼的亮度感知。
| 像素位置 | 第1列 | 第2列 | 第3列 | 第4列 |
|---|---|---|---|---|
| 第1行 | R | G | R | G |
| 第2行 | G | B | G | B |
| 第3行 | R | G | R | G |
| 第4行 | G | B | G | B |
你想想看,每个2x2的块里,有1个R、2个G、1个B。这就是最经典的Bayer模式。当然也有其他变种,比如RGBW、RCCC等,但Bayer是主流。
个人习惯:我在调试ISP时,第一步永远是先验证Bayer排列顺序。不同厂商的传感器,Bayer的起始相位可能不同——有的是RGGB,有的是BGGR。搞错了,整张图颜色就全乱了。
去马赛克:从残缺到完整
去马赛克(Demosaic)就是把Bayer RAW变成完整RGB图像的过程。说白了,就是给每个像素补上缺失的两种颜色。
最简单的办法是双线性插值——用相邻同色像素的平均值。但这样会带来严重的伪色和锯齿。我早期做算法时用过这种方法,结果图像边缘全是彩色条纹,惨不忍睹。
稍微好一点的是边缘导向插值。先检测边缘方向,然后沿着边缘方向插值,不跨边缘。这样能大幅减少伪色。
再高级一点,就是基于梯度的方法。比如Hamilton-Adams算法,它用色差(R-G、B-G)的梯度来指导插值。色差在图像局部通常是平滑的,利用这个先验能恢复出更自然的细节。
我曾经踩过的坑:去马赛克算法对噪声非常敏感。如果RAW图有噪声,插值会把噪声放大成彩色斑点。所以ISP流水线里,去马赛克之前通常先做降噪。顺序搞反了,图像质量会断崖式下降。
ISP流水线基础:从RAW到YUV
ISP(Image Signal Processor)流水线,就是把RAW图一步步处理成可显示、可编码的图像。典型的ISP流水线包含以下模块:
- 黑电平校正:减去传感器暗电流带来的固定偏置
- 镜头阴影校正:补偿镜头边缘亮度衰减
- 坏点校正:修复传感器上的死点或亮点
- 降噪:减少传感器噪声
- 去马赛克:Bayer到RGB
- 白平衡:调整色温,让白色物体看起来是白的
- 颜色校正矩阵:把传感器颜色空间映射到标准颜色空间
- Gamma校正:从线性空间转到非线性显示空间
- 色调映射:压缩动态范围,适配显示设备
嗯,这里要注意——不同厂商的ISP流水线顺序可能略有差异。但核心逻辑是一致的:先校正传感器缺陷,再恢复颜色,最后做显示适配。
下面这张图展示了ISP流水线的基本流程:
ISP流水线中的关键权衡
做ISP调试,本质上是在多个指标之间找平衡。我整理了一张表,列出几个最常见的权衡:
| 权衡项 | 偏向一方 | 偏向另一方 | 我的建议 |
|---|---|---|---|
| 降噪 vs 细节 | 降噪强 → 图像平滑 | 降噪弱 → 细节保留 | 根据场景动态调整,夜景多降噪,白天少降噪 |
| 锐化 vs 伪影 | 锐化强 → 边缘清晰 | 锐化弱 → 无过冲 | 宁可欠锐化,不要出现halo |
| 饱和度 vs 自然度 | 饱和度高 → 鲜艳 | 饱和度低 → 真实 | 消费级产品可以偏鲜艳,专业级偏真实 |
| 动态范围 vs 对比度 | HDR强 → 细节丰富 | 对比度高 → 视觉冲击 | HDR要配合色调映射,否则图像发灰 |
我个人习惯是,先保证基础质量(无坏点、无色偏、无伪色),再调风格参数(饱和度、锐度、对比度)。基础没打好,后面怎么调都救不回来。
小结
这一章我们覆盖了图像数据管道的三个核心环节:RAW图格式、Bayer阵列与去马赛克、ISP流水线基础。说白了,就是从传感器原始数据到可显示图像的完整链路。
理解这些基础,后面讲AWB、AE、AF时你才能知道——这些算法到底在ISP流水线的哪个位置起作用,它们又受哪些前置模块的影响。
一个实用建议:如果你刚开始接触ISP,建议先找一个开源的ISP pipeline(比如libcamera或rawpy),把RAW图跑一遍。亲眼看看每个模块前后的图像变化,比看一百页文档都管用。