3、色彩从哪里来?Bayer阵列与色彩还原的魔法

你有没有想过一个问题——传感器明明是“色盲”的,它只能感知光的强弱,那彩色照片是怎么来的?

我第一次接触这个疑问是在调试一款车规级传感器的时候。当时客户抱怨暗光下颜色偏紫,我盯着原始RAW数据看了半天,全是灰度值。嗯,那时候我才真正意识到:色彩不是传感器“看见”的,而是算出来的。

3.1 传感器的“色盲”本质

每个像素点本质上就是一个光子计数器。它不关心光是红的还是蓝的,只关心“来了多少光子”。所以裸传感器输出的是一幅单通道灰度图。

那怎么得到彩色?答案是在像素表面覆盖一层彩色滤光片阵列(CFA,Color Filter Array)。每个像素只允许特定波长的光通过——红、绿或蓝。这样,每个像素就只记录一种颜色分量。

核心概念:传感器输出的RAW数据,每个像素只有R/G/B中的一种分量。要得到全彩图像,必须通过算法“猜”出每个像素缺失的另外两个颜色值。这个过程就叫Demosaic(去马赛克)。

3.2 Bayer阵列——最经典的CFA模式

CFA有很多种,但Bayer阵列是的主流。它由Bryce Bayer在1976年发明,至今仍是90%以上传感器的标配。

Bayer阵列的排列规律很简单:

  • 50% 绿色(G)——人眼对绿色最敏感
  • 25% 红色(R)
  • 25% 蓝色(B)

典型的2×2单元是:

R  G
G  B

为什么绿色多一倍?因为人眼的亮度感知主要依赖绿色通道。多放绿色像素,能提升视觉分辨率和信噪比。我在做安防相机调试时,发现低照度下绿色通道的噪声明显比红蓝通道低,就是这个原因。

3.3 Demosaic——从马赛克到全彩

拿到Bayer RAW后,每个像素只有一种颜色。比如一个红色像素,它缺了绿色和蓝色。Demosaic算法就是根据周围像素的信息,插值计算出缺失的颜色值。

我把它分成三类,从简单到复杂:

算法类型 原理 计算量 画质 典型场景
最近邻插值 直接复制相邻像素的颜色 极低 差(锯齿严重) 预览、低功耗
双线性插值 取周围像素的加权平均 低 一般(边缘模糊) 早期手机
边缘导向插值 先检测边缘方向,沿边缘插值 中等 好(细节保留) 主流方案
自适应插值 结合梯度、纹理、色差模型 高 优秀 高端相机

我个人习惯用边缘导向插值作为基线。它在画质和算力之间取得了很好的平衡。我曾经在FPGA上实现过双线性插值,结果边缘全是彩色锯齿——那种“彩虹纹”在文字边缘特别明显,客户一看就摇头。

3.4 插值带来的问题——伪色与锯齿

Demosaic不是完美的。它本质上是在“猜”,猜错了就会出问题。

常见伪影:

  • 伪色(False Color):在高频纹理区域(如细条纹、文字边缘),插值会引入不存在的颜色。比如黑白条纹边缘出现红蓝杂色。
  • 锯齿(Zipper Effect):沿着边缘出现阶梯状或拉链状的亮度跳变。
  • 模糊(Blurring):插值本质是低通滤波,会损失高频细节。

我曾经调试一款工业相机,拍摄电路板上的细线时,伪色严重到无法做自动光学检测。后来把插值算法从双线性换成边缘导向,再配合一个简单的色差校正,问题才解决。

3.5 实战中的Demosaic调优要点

如果你在调试传感器,下面几个参数是必须关注的:

  1. 边缘阈值:控制算法在多大梯度下启用边缘保护。阈值太低,边缘保护过度,平坦区域出现纹理;阈值太高,边缘锯齿又回来了。
  2. 色差抑制强度:伪色通常表现为红蓝通道的异常跳变。适当抑制色差能减少伪色,但过度会损失色彩饱和度。
  3. 亮度/色度分离处理:先插值亮度通道(G),再基于亮度信息插值色度通道(R/B)。这样做能减少色度噪声。
  4. 去马赛克后的低通滤波:对色度通道做轻微的低通滤波,可以平滑伪色,但注意不要模糊边缘。

我的调试习惯:先用一张ISO 12233分辨率测试卡看边缘锯齿和伪色,再用ColorChecker色卡看色彩还原精度。两个都过了,再调信噪比和纹理保留的平衡。

3.6 知识结构图:Bayer与Demosaic全景

下面这张图把整个流程串起来了。从传感器采集到全彩输出,每一步都离不开Demosaic。

Bayer阵列与Demosaic流程 Bayer阵列 → Demosaic → 全彩图像 场景光 Bayer CFA滤光 RAW单通道数据 Demosaic插值 全彩RGB图像 Bayer 2×2单元 R G G B 常见插值算法 • 最近邻:速度最快,画质最差 • 双线性:简单,边缘模糊 • 边缘导向:平衡画质与算力 • 自适应:画质最好,计算量大 常见伪影 • 伪色:高频区域出现杂色 • 锯齿:边缘阶梯状跳变 • 模糊:细节损失 • 摩尔纹:周期性纹理干扰

3.7 避坑指南:我踩过的三个坑

调试Demosaic这么多年,有些坑是绕不过去的。分享几个我自己的经历:

坑一:过度依赖算法,忽略硬件噪声

我曾经花了两周调插值参数,伪色始终压不下去。最后发现是传感器模拟增益太高,绿色通道的噪声被放大后,插值算法把噪声当成了纹理。先降噪,再Demosaic,效果立竿见影。

坑二:在RAW域做太多处理

有些同事喜欢在Demosaic之前做大量图像处理,比如锐化、对比度增强。这其实很危险——插值算法会把处理后的伪影放大。我的原则是:RAW域只做黑电平校正、线性化和降噪,其他处理放到Demosaic之后。

坑三:忽视Bayer模式匹配

不同传感器的Bayer排列可能不同。有的是RGGB,有的是BGGR,还有GRBG。我曾经因为读错了Bayer模式,导致整幅图像颜色完全错乱——红色变成了蓝色,绿色变成了紫色。排查了三天才发现是配置表写错了。

3.8 小结

色彩不是传感器“拍”出来的,而是算出来的。Bayer阵列让每个像素只记录一种颜色,Demosaic算法则负责把缺失的颜色“猜”出来。这个“猜”的过程,决定了图像的细节、色彩和噪声水平。

调试Demosaic时,记住三个关键词:边缘保护、伪色抑制、算力平衡。没有完美的算法,只有最适合你场景的配置。