4. 相机成像流程:从RAW到RGB,Bayer阵列与去马赛克,ISP Pipeline中的AWB位置

好,咱们今天聊点硬核的。你按下快门那一瞬间,相机里到底发生了什么?

很多人以为拍出来就是一张漂亮的JPEG,其实不是。传感器捕捉到的,只是一堆电压值。嗯,说白了就是RAW数据。这玩意儿离我们能看的RGB图像,还差着十万八千里。

我个人习惯把整个流程拆成三段:RAW采集 → ISP处理 → 编码输出。而AWB,就藏在ISP Pipeline的中间位置。今天咱们就把这段路走一遍。

4.1 从光子到数字:RAW数据怎么来的

先说说传感器。每个像素点其实就是一个光电二极管,它只能感知光的强度,分辨不出颜色。那彩色照片怎么来的?

答案就是Bayer阵列。在传感器表面覆盖一层彩色滤光片阵列(CFA),让每个像素只通过一种颜色。最常见的模式是RGGB,也就是一个红色、两个绿色、一个蓝色,排成2x2的格子。

为什么绿色有两个?

因为人眼对绿色最敏感。多采一个绿色通道,能模拟人眼的亮度感知。我在项目中试过用RCCC(红-清-清-清)阵列做安防摄像头,虽然进光量大了,但色彩还原一塌糊涂——最后还是老老实实换回RGGB。

传感器输出的RAW数据,每个像素只有一个通道的值。比如一个2000万像素的传感器,RAW文件里就是2000万个单通道数值,按Bayer模式排列。这时的数据是线性的,而且每个像素的颜色都不全。

Bayer模式 排列方式 常见应用
RGGB R G / G B 手机、相机、安防
BGGR B G / G R 部分索尼传感器
GRBG G R / B G 部分三星传感器
RCCC R C / C C 低照度安防

4.2 去马赛克:把残缺补全

RAW数据里每个像素只有一个颜色通道,但我们要的是每个像素都有R、G、B三个值。这个过程就叫去马赛克(Demosaicing),也叫插值。

最简单的办法是双线性插值。比如一个红色像素,它缺绿色和蓝色,那就拿周围相邻的绿色和蓝色像素平均一下。但这样做出来的图像边缘会有锯齿和伪色。

我踩过的坑:

曾经在一个低功耗项目里用了最简单的双线性插值,结果拍出来的文字边缘全是彩色条纹。后来换成自适应插值(比如Hamilton-Adams算法),伪色明显减少,但计算量翻了三倍。嗯,这就是工程上的取舍。

现在主流算法有几种:

  • 双线性插值:快,但质量差,适合预览
  • 边缘导向插值:先检测边缘方向,再沿边缘插值,伪色少
  • 基于梯度的方法:计算色差梯度,用梯度权重融合,效果更好
  • 深度学习去马赛克:用CNN直接端到端恢复,质量最高,但算力要求也最高

去马赛克之后,我们就得到了一个完整的RGB图像。但注意,这时的图像还是线性的,而且白平衡还没校正。

4.3 ISP Pipeline:AWB到底站在哪

ISP(Image Signal Processor)是一套流水线,RAW数据进来,经过一串处理,最后输出YUV或RGB。我画了一张图,把主要模块和AWB的位置标出来了。

ISP Pipeline 与 AWB 位置 RAW 输入 黑电平校正 去马赛克 AWB Gamma 校正 颜色校正 去噪 锐化 YUV 输出 关键说明 • AWB 在去马赛克之后、Gamma 校正之前 • 此时图像还是线性空间,AWB 做的是通道增益乘法 • 如果 AWB 放在 Gamma 之后,色温校正会非线性失真

你看,AWB在去马赛克之后,Gamma校正之前。为什么是这个位置?

去马赛克之后,每个像素都有了完整的RGB值,AWB才能做通道增益。而Gamma校正会改变数据的非线性关系,如果AWB放在Gamma之后,你想想看,同样的增益在不同亮度区域效果不一样,色温校正就乱套了。

注意:

有些低端ISP会把AWB放在去马赛克之前,直接在Bayer域做增益。这样做的好处是省内存,但坏处是插值时会放大噪声。我曾经在一个项目里试过这种方案,结果暗部全是彩色噪点——后来老老实实改回标准流程。

4.4 AWB在Pipeline中的实际影响

AWB的位置决定了它的输入数据长什么样。在去马赛克之后,数据是线性RGB,每个通道独立。AWB要做的就是给R和B通道乘一个增益系数,让中性色(比如灰色、白色)的R=G=B。

举个例子:

// 假设AWB计算出的增益
float gain_R = 1.8;
float gain_B = 1.2;
// G通道增益通常为1.0

// 对每个像素应用
pixel.R = clamp(pixel.R * gain_R, 0, 1023);
pixel.B = clamp(pixel.B * gain_B, 0, 1023);
// G通道不变

就这么简单?嗯,原理上是的。但实际工程里,增益不能无限大,否则噪声会被放大。我一般会把增益限制在[0.5, 3.0]之间,超过这个范围就做裁剪或平滑过渡。

4.5 小结:记住这几件事

  • Bayer阵列让每个像素只采一种颜色,RGGB最常见
  • 去马赛克把单通道RAW插值成三通道RGB,算法好坏直接影响画质
  • AWB在ISP Pipeline中的位置:去马赛克之后,Gamma校正之前
  • AWB的本质:在线性RGB空间做通道增益乘法