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 知识结构总览
下面这张图,把本章的核心脉络串起来了。你可以把它当作一个快速索引。
2.6 实际项目中的注意事项
最后,分享几个我在项目中踩过的坑:
- 字节序问题:有些传感器是大端,有些是小端。读RAW数据前,先确认CPU和传感器的字节序是否一致。
- 黑电平校正:RAW数据里通常有暗电流偏置。不做黑电平校正,直接做降噪,效果会打折扣。
- 坏点处理:传感器总有坏点。我习惯在RAW域先做坏点校正,再做其他处理。顺序很重要。
一句话总结:RAW数据格式的核心就三件事——Bayer阵列怎么排、每个像素多少位、数据怎么存。搞懂这三样,你就能和传感器愉快地对话了。