2. RAW数据格式解析:Bayer阵列、RGGB/GRBG等模式、RAW10/RAW12/RAW16位深

做图像处理这些年,我接触过不少刚入行的工程师。他们拿到RAW文件时,第一反应往往是——这堆数字到底是什么?

说白了,RAW数据就是传感器最原始的“底片”。它没经过任何美化,也没被压缩。你看到的每一个像素值,都直接来自感光元件上的光电转换。今天我们就把它彻底拆开看看。

2.1 Bayer阵列——为什么不是全彩的?

你可能会问:为什么手机拍出来的RAW文件不是彩色的?嗯,这里有个物理限制。

单个感光像素只能感知光的强度,它分不清颜色。那怎么办?工程师们想了个办法:在每个像素前面盖一层彩色滤光片。这就是Bayer阵列的由来。

核心思想:用4个像素为一组,分别覆盖R、G、G、B滤光片。绿色占一半,因为人眼对绿色最敏感。

我最早做ISP调试时,曾以为Bayer阵列是唯一的方案。后来发现,其实还有X-Trans、Quad Bayer等变种。但Bayer依然是主流,90%以上的传感器都在用。

2.2 RGGB与GRBG——模式差异

同样是Bayer,排列顺序却不一样。最常见的两种模式:

模式 第一行 第二行 常见传感器
RGGB R G R G ... G B G B ... Sony IMX系列
GRBG G R G R ... B G B G ... OmniVision、部分三星
BGGR B G B G ... G R G R ... 部分安森美传感器
GBRG G B G B ... R G R G ... 较少见

我的经验:拿到新传感器时,第一件事就是确认Bayer模式。我曾经因为搞错GRBG和RGGB,导致整张图偏色严重,排查了整整两天。后来我养成了习惯——直接读传感器寄存器里的配置,而不是看文档。

为什么会有这么多模式?其实没有本质区别,只是传感器厂商的布线习惯不同。但你在做demosaic(去马赛克)时,必须告诉算法正确的排列顺序,否则颜色就全乱了。

2.3 位深——RAW10、RAW12、RAW16

位深决定了每个像素能记录多少灰度等级。这个参数直接影响动态范围和噪点表现。

位深 灰度等级 每像素存储 典型场景
RAW10 1024 10bit(常打包为16bit) 手机、消费级相机
RAW12 4096 12bit(常打包为16bit) 工业相机、中端相机
RAW14 16384 14bit 高端单反、科学相机
RAW16 65536 16bit 天文、医疗、科研

你想想看,RAW10只有1024个灰度级。在暗光场景下,相邻像素的差异可能只有1-2个灰度值。这时候做降噪,信息量是不够的。而RAW16有65536级,暗部细节丰富得多。

注意:位深越高,数据量越大。RAW16比RAW10大了60%的存储空间。而且,并不是所有传感器都能输出真正的RAW16——有些只是把RAW12左移4位,假装成16位。我踩过这个坑,后来学会了先检查有效位宽。

2.4 数据存储格式——打包与对齐

RAW数据在内存里怎么放的?这里有个小陷阱。

以RAW10为例:每个像素10bit,但计算机按字节(8bit)寻址。所以常见的做法是:

  • 16bit对齐:每个像素占2字节,高6位补0。简单,但浪费空间。
  • 打包格式:4个像素共40bit,打包成5字节。省空间,但解析麻烦。
// RAW10 打包格式示例(4像素 -> 5字节)
// 像素0: 10bit, 像素1: 10bit, 像素2: 10bit, 像素3: 10bit
// 字节0: [像素0 9:2]
// 字节1: [像素0 1:0][像素1 9:4]
// 字节2: [像素1 3:0][像素2 9:6]
// 字节3: [像素2 5:0][像素3 9:8]
// 字节4: [像素3 7:0]

uint8_t packed[5];
uint16_t pixel[4];
// 解包逻辑
pixel[0] = (packed[0] << 2) | (packed[1] >> 6);
pixel[1] = ((packed[1] & 0x3F) << 4) | (packed[2] >> 4);
pixel[2] = ((packed[2] & 0x0F) << 6) | (packed[3] >> 2);
pixel[3] = ((packed[3] & 0x03) << 8) | packed[4];

建议:做原型验证时,先用16bit对齐格式。等算法稳定了,再优化成打包格式。别一开始就给自己找麻烦。

2.5 知识结构总览

下面这张图,把本章的核心脉络串起来了。你可以把它当作一个快速索引。

RAW数据格式知识结构 RAW数据格式 Bayer阵列 Bayer模式 位深 彩色滤光片(CFA) RGGB 2x2单元 绿色占50% RGGB / GRBG BGGR / GBRG 影响demosaic结果 RAW10 / RAW12 RAW14 / RAW16 动态范围差异 关键要点 • Bayer阵列是RAW数据的基础,决定了颜色采样方式 • 模式错误会导致全图偏色,务必从传感器寄存器确认 • 位深越高,暗部细节越丰富,但数据量和处理开销也越大

2.6 实际项目中的注意事项

最后,分享几个我在项目中踩过的坑:

  • 字节序问题:有些传感器是大端,有些是小端。读RAW数据前,先确认CPU和传感器的字节序是否一致。
  • 黑电平校正:RAW数据里通常有暗电流偏置。不做黑电平校正,直接做降噪,效果会打折扣。
  • 坏点处理:传感器总有坏点。我习惯在RAW域先做坏点校正,再做其他处理。顺序很重要。

一句话总结:RAW数据格式的核心就三件事——Bayer阵列怎么排、每个像素多少位、数据怎么存。搞懂这三样,你就能和传感器愉快地对话了。