4. RAW图数据格式:Bayer Pattern、位深与数据对齐

好,咱们进入传感器调试里最基础、也最绕不开的一环——RAW图数据格式。很多刚入行的朋友觉得这玩意儿就是“原始像素值”,没什么好讲的。但我在项目里踩过的坑告诉我,不理解Bayer Pattern和位深,后面调3A算法基本是盲人摸象。

说白了,RAW图就是传感器“看到”的原始数据,未经任何ISP处理。它长什么样?怎么存的?位深又是什么意思?咱们一个一个来。

4.1 Bayer Pattern:马赛克下的秘密

大部分单传感器相机,每个像素只能感知光的强度,分不清颜色。那彩色图像怎么来的?答案就是Bayer Pattern——在像素表面覆盖一层彩色滤光片阵列(CFA)。

最常见的模式是RGGB和GRBG。你想想看,一个2x2的像素块里,绿色占了两个,红蓝各一个。为什么?因为人眼对绿色最敏感,所以传感器给绿色分配了更多像素,模拟人眼的亮度感知。

关键点:Bayer Pattern决定了后续去马赛克(Demosaic)算法的输入格式。搞错Pattern,颜色就全乱了。

我遇到过一件事:某次调试一款新传感器,默认配置是RGGB,但实际硬件走线是GRBG。结果拍出来的图像,红色草地、蓝色人脸……排查了两天才发现是Pattern配错了。嗯,从那以后,我拿到任何新模组,第一件事就是对着灰卡拍一张,检查Pattern是否正确。

常见的Bayer Pattern有四种:

Pattern名称 第一行 第二行 常见场景
RGGB R G R G ... G B G B ... Sony、OmniVision多数型号
GRBG G R G R ... B G B G ... 部分三星、安森美传感器
GBRG G B G B ... R G R G ... 某些老款CCD
BGGR B G B G ... G R G R ... 少数工业相机

我的习惯:在驱动层用一个枚举变量保存Pattern,并在初始化时从传感器寄存器读取确认。不要硬编码。

4.2 RAW10 / RAW12 / RAW14:位深决定动态范围

位深,就是每个像素用多少比特来表示。RAW8、RAW10、RAW12、RAW14……数字越大,能表示的灰度等级越多,动态范围越宽。

举个例子:

  • RAW8:0~255,共256级。手机入门传感器常见。
  • RAW10:0~1023,共1024级。很多车载、安防传感器用这个。
  • RAW12:0~4095,共4096级。工业相机、高端监控主流。
  • RAW14:0~16383,共16384级。专业摄影、科学级相机。

位深越高,暗部细节越丰富,高光也不容易过曝。但代价是数据量变大,传输带宽和存储压力也上去了。

注意:位深不是越高越好。如果你的ADC噪声本身就很大,14位的后几位全是噪声,反而浪费带宽。我见过有人硬上14位,结果信噪比还不如12位。

我个人习惯:先看传感器ADC的有效位数(ENOB),再决定用多少位输出。ENOB通常比标称位深低1~2位。

4.3 数据对齐:像素怎么塞进内存

位深定了,但数据怎么在内存里排列?这就涉及到数据对齐(Data Alignment)。

RAW10和RAW12比较特殊,因为它们不是8的整数倍。为了节省带宽,通常采用“打包”方式存储。

常见的对齐方式:

位深 存储方式 说明
RAW8 1像素 = 1字节 最简单,直接按字节排列
RAW10 4像素 = 5字节 每4个像素打包成40bit,存5字节
RAW12 2像素 = 3字节 每2个像素打包成24bit,存3字节
RAW14 4像素 = 7字节 每4个像素打包成56bit,存7字节

举个例子,RAW10的打包方式:

// 4个RAW10像素:p0, p1, p2, p3 (各10bit)
// 打包成5字节:
// Byte0: p0[9:2]  (高8位)
// Byte1: p1[9:2]  (高8位)
// Byte2: p2[9:2]  (高8位)
// Byte3: p3[9:2]  (高8位)
// Byte4: p0[1:0] | p1[1:0]<<2 | p2[1:0]<<4 | p3[1:0]<<6
//         (每个像素的低2位拼成一个字节)

避坑指南:我曾经在移植ISP算法时,没注意RAW10的打包顺序,结果图像出现周期性条纹。后来发现是字节序搞反了——有的传感器用Little Endian,有的用Big Endian。调试时一定要先打印一帧原始数据,手动验证打包逻辑。

4.4 知识结构图:RAW数据格式全景

下面这张图帮你理清本章的核心脉络:

RAW数据格式知识结构图 RAW数据格式知识结构 RAW图数据格式 Bayer Pattern 位深 (Bit Depth) 数据对齐 RGGB GRBG GBRG BGGR RAW8 RAW10 RAW12 RAW14 打包存储 字节序 核心要点 Pattern决定颜色排列,位深决定动态范围,对齐决定数据怎么读 三者共同影响ISP流水线的输入质量

4.5 实战建议:调试时先确认这三件事

拿到一个新传感器模组,我建议按以下顺序确认RAW数据格式:

  1. 读寄存器确认Pattern:大部分传感器有专门的寄存器指示Bayer Pattern排列。
  2. 抓一帧RAW数据:用逻辑分析仪或驱动层dump原始数据,手动解析前几个像素。
  3. 验证对齐方式:用已知的灰度梯度图拍摄,检查数据是否有错位或周期性错误。

一句话总结:RAW数据格式是传感器和ISP之间的“契约”。契约不对,后面全是白费功夫。