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调优要点
如果你在调试传感器,下面几个参数是必须关注的:
- 边缘阈值:控制算法在多大梯度下启用边缘保护。阈值太低,边缘保护过度,平坦区域出现纹理;阈值太高,边缘锯齿又回来了。
- 色差抑制强度:伪色通常表现为红蓝通道的异常跳变。适当抑制色差能减少伪色,但过度会损失色彩饱和度。
- 亮度/色度分离处理:先插值亮度通道(G),再基于亮度信息插值色度通道(R/B)。这样做能减少色度噪声。
- 去马赛克后的低通滤波:对色度通道做轻微的低通滤波,可以平滑伪色,但注意不要模糊边缘。
我的调试习惯:先用一张ISO 12233分辨率测试卡看边缘锯齿和伪色,再用ColorChecker色卡看色彩还原精度。两个都过了,再调信噪比和纹理保留的平衡。
3.6 知识结构图:Bayer与Demosaic全景
下面这张图把整个流程串起来了。从传感器采集到全彩输出,每一步都离不开Demosaic。
3.7 避坑指南:我踩过的三个坑
调试Demosaic这么多年,有些坑是绕不过去的。分享几个我自己的经历:
坑一:过度依赖算法,忽略硬件噪声
我曾经花了两周调插值参数,伪色始终压不下去。最后发现是传感器模拟增益太高,绿色通道的噪声被放大后,插值算法把噪声当成了纹理。先降噪,再Demosaic,效果立竿见影。
坑二:在RAW域做太多处理
有些同事喜欢在Demosaic之前做大量图像处理,比如锐化、对比度增强。这其实很危险——插值算法会把处理后的伪影放大。我的原则是:RAW域只做黑电平校正、线性化和降噪,其他处理放到Demosaic之后。
坑三:忽视Bayer模式匹配
不同传感器的Bayer排列可能不同。有的是RGGB,有的是BGGR,还有GRBG。我曾经因为读错了Bayer模式,导致整幅图像颜色完全错乱——红色变成了蓝色,绿色变成了紫色。排查了三天才发现是配置表写错了。
3.8 小结
色彩不是传感器“拍”出来的,而是算出来的。Bayer阵列让每个像素只记录一种颜色,Demosaic算法则负责把缺失的颜色“猜”出来。这个“猜”的过程,决定了图像的细节、色彩和噪声水平。
调试Demosaic时,记住三个关键词:边缘保护、伪色抑制、算力平衡。没有完美的算法,只有最适合你场景的配置。