2、RAW数据存储结构:Bayer阵列模式与CFA原理

说到RAW数据,很多人第一反应就是“大”、“占空间”。但真正决定RAW格式本质的,其实是它的存储结构——每个像素只记录一种颜色信息。这听起来有点反直觉,对吧?你想想看,我们平时看到的彩色照片,每个像素都是RGB三个值。但RAW偏偏只存一个值。这是为什么?

我刚开始接触图像传感器时,也被这个问题困扰过。后来拆了几块Sensor的datasheet,才真正搞明白——这其实是硬件成本和画质之间的一个巧妙平衡。

2.1 彩色滤波阵列(CFA)的核心思想

CMOS或CCD传感器本身是“色盲”的。每个感光单元只能感知光的强度,分辨不出颜色。那怎么得到彩色图像呢?

答案就是在每个像素上覆盖一层微小的滤色片——只允许特定波长的光通过。这就是彩色滤波阵列(Color Filter Array,CFA)。

一句话总结:CFA让每个像素只“看到”一种颜色,RAW文件里每个像素只存一个通道的值。后续的插值算法再把缺失的颜色猜出来。

我做过一个比喻,你把它想象成用三支不同颜色的笔在一张白纸上点画。每个点只有一种颜色,但离远了看,画面就是彩色的。CFA就是这个“点画”的规则。

2.2 Bayer阵列——最主流的CFA模式

CFA有很多种设计,但Bayer阵列是的主流。它由Bryce Bayer在1976年发明,到今天几乎所有消费级和工业级传感器都在用。

Bayer阵列的核心规律很简单:绿色像素占一半,红色和蓝色各占四分之一。为什么绿色多?因为人眼对绿色最敏感。说白了,这是仿生学的设计——让传感器模仿人眼的视觉特性。

颜色通道 占比 原因
绿色(G) 50% 人眼对绿光最敏感,细节分辨力最高
红色(R) 25% 提供红色分量,用于色彩还原
蓝色(B) 25% 提供蓝色分量,用于色彩还原

Bayer阵列有四种常见的排列方式。我当年在调试一款安防摄像头时,就踩过这个坑——Sensor默认输出是GBRG,但ISP流水线配置成了RGGB,结果整张图颜色完全错乱。

2.2.1 四种Bayer排列模式

这四种模式的区别在于第一行前两个像素的颜色顺序。记住这个规律,你就能快速识别任何Bayer RAW数据。

模式 第一行 第二行 常见场景
RGGB R G R G ... G B G B ... 索尼Sensor最常见
BGGR B G B G ... G R G R ... 部分OmniVision Sensor
GRBG G R G R ... B G B G ... 部分三星Sensor
GBRG G B G B ... R G R G ... 安防Sensor常见

避坑指南:我曾经在项目中拿到一份RAW文件,怎么处理颜色都不对。折腾了两天,最后发现是Bayer排列搞错了。Sensor文档写的是GBRG,但实际输出是GRBG。从那以后,我养成了一个习惯——拿到新Sensor,先拍一张纯白画面,用脚本验证Bayer排列。这一步花不了5分钟,但能省下后面几天的调试时间。

2.3 每个像素只存单通道——RAW的“原始”之处

理解了CFA,你就明白了为什么RAW文件每个像素只存一个值。这不是缺陷,而是设计选择。

  • 存储效率高:每个像素只存12bit或14bit,而不是3×12bit。同样分辨率下,RAW比RGB图像小2/3。
  • 保留原始信息:没有经过插值,没有颜色处理。你拿到的是Sensor最“诚实”的数据。
  • 后期空间大:所有颜色重建、白平衡、去马赛克都在你的控制之下。

我举个例子。假设一个2000万像素的Sensor,输出RAW文件大约25MB(14bit/pixel)。如果直接输出RGB,那就是75MB。而且RGB是经过ISP处理过的,很多细节已经丢失了。你想想看,哪个选择更合理?

2.4 从RAW到彩色图像——数据流全景

为了让你更直观地理解整个流程,我画了一张图。它展示了从Sensor捕获到Bayer RAW,再到最终彩色图像的关键步骤。

Bayer RAW数据流与CFA结构 场景光线 R/G/B混合光 CFA滤色 每个像素只过一种颜色 Bayer RAW 单通道像素阵列 去马赛克 Bayer阵列局部(2×2单元) R G G B RGGB RGGB BGGR GRBG GBRG 关键理解 • 每个像素只存一个通道值(R/G/B之一),RAW文件是单通道灰度图 • 绿色像素占50%,红色和蓝色各占25%——这是Bayer阵列的核心设计 • 四种排列模式(RGGB/BGGR/GRBG/GBRG)取决于第一行前两个像素的顺序 • 去马赛克(Demosaic)算法通过周围像素插值,重建每个像素的RGB三通道

2.5 实际项目中如何判断Bayer排列

拿到一个陌生的RAW文件,怎么快速确定它的Bayer排列?我分享一个我常用的方法。

  1. 拍一张纯色画面——最好是白色或灰色,均匀光照。
  2. 提取RAW数据——用Python或C读入,不要做任何处理。
  3. 观察2×2块的统计值——计算每个位置的均值。理论上,白色画面下R、G、B的响应比例是固定的。
  4. 匹配模式——根据均值大小关系,判断哪个位置是R、哪个是B。

我的经验:如果你懒得写脚本,还有一个土办法——拍一张红色物体的照片。在RAW数据里,红色物体对应的像素值会明显偏高。你肉眼扫一下2×2块,哪个位置最亮,那个位置就是R通道。这个方法虽然粗糙,但在现场调试时非常管用。

2.6 为什么不是所有传感器都用Bayer

Bayer虽然主流,但不是唯一选择。我简单提几种其他CFA设计,让你有个概念。

CFA类型 特点 应用场景
Bayer G占50%,成熟度高 绝大多数消费级/工业级相机
X-Trans 6×6周期,减少摩尔纹 富士相机
Quad Bayer 2×2同色合并,高像素模式 手机Sensor(如IMX586)
Foveon X3 垂直堆叠RGB,无插值 适马相机

但说实话,Bayer的地位短期内很难被撼动。它的生态太成熟了——从Sensor设计到ISP芯片,再到软件库,整个产业链都围着Bayer转。我做过一个项目,尝试用X-Trans传感器,结果发现很多现成的去马赛克算法都不支持,最后不得不自己写。嗯,那段时间挺痛苦的。

2.7 本章小结

这一章的核心就三句话:

  • CFA 让每个像素只感知一种颜色,这是RAW格式的物理基础。
  • Bayer阵列 是最主流的CFA模式,G:R:B = 2:1:1。
  • 四种排列(RGGB/BGGR/GRBG/GBRG)决定了RAW数据的解析方式,搞错了颜色就全乱。