4. RAW数据格式:从传感器到数字世界的第一次握手

各位同学,欢迎来到第四章。前面我们聊了摄像头的光学系统和传感器基础,今天终于要触及ISP流程中最原始、也最核心的数据形态——RAW数据。

说白了,RAW就是传感器“看到”的原始电信号,经过模数转换后得到的数字值。它还没经过任何美化处理,就像一张没修过的底片。我经常跟团队里的新人说:理解RAW,你就理解了ISP的一半。

4.1 RAW数据的位深与存储

先说说位深。位深决定了每个像素能记录多少灰度等级。

  • 8-bit RAW:0~255,共256级。早期手机传感器常用,动态范围有限。
  • 10-bit RAW:0~1023,共1024级。目前主流安防和车载传感器标准。
  • 12-bit RAW:0~4095,共4096级。高端相机和旗舰手机标配。
  • 14-bit / 16-bit RAW:专业领域使用,数据量巨大。

你可能会问:位深越高越好吗?理论上是的,但代价也很明显——存储和带宽压力成倍增加。10-bit RAW比8-bit数据量多25%,12-bit则多50%。

我的经验:在项目中选位深时,我习惯先看应用场景。安防监控追求低带宽,10-bit够用;手机拍照要后期调色空间,12-bit起步。别盲目追高,成本和性能要平衡。

存储格式上,RAW数据通常以线性或压缩格式保存。常见的存储方式有:

  • 纯RAW(.raw / .dng):无压缩,保留全部信息,文件巨大。
  • MIPI RAW(打包格式):传感器通过MIPI接口传输时,10-bit数据常用“打包”方式,每5个字节存4个像素。
  • 压缩RAW:如无损或近无损压缩,用于节省存储空间。

这里有个坑——字节对齐。10-bit数据在内存中如果不做对齐处理,读写效率会很低。我见过一个项目,工程师直接用16-bit存10-bit数据,白白浪费了37.5%的带宽。嗯,后来优化成打包格式,带宽问题就解决了。

4.2 Bayer模式:RGGB、GBRG、BGGR、GRBG

传感器上的每个像素只能感知光的强度,不能区分颜色。那彩色图像怎么来的?答案就是Bayer滤色阵列。

Bayer模式的核心思想:在像素上覆盖红、绿、蓝滤色片,按特定排列方式。人眼对绿色最敏感,所以绿色像素占一半,红蓝各占四分之一。

常见的四种Bayer模式:

模式名称 第一行 第二行 常见应用
RGGB R G R G ... G B G B ... Sony、OmniVision多数传感器
GBRG G B G B ... R G R G ... 部分三星传感器
BGGR B G B G ... G R G R ... 老旧CCD传感器
GRBG G R G R ... B G B G ... 部分安防传感器
避坑指南:我曾经在一个项目中,ISP配置写错了Bayer模式,结果出来的图像全是紫色和绿色条纹。排查了两天才发现是Bayer顺序搞反了。记住:Bayer模式必须和传感器物理排列严格对应,否则后续所有处理都是错的。

为什么会有这么多模式?说白了就是传感器厂商的封装习惯不同。但无论哪种模式,本质都是2×2的重复单元。ISP的第一步就是根据Bayer模式,把RAW数据正确解析出来。

下面这张图展示了Bayer阵列的基本结构:

Bayer模式结构示意图 R G G B 2×2 重复单元 (RGGB) 完整Bayer阵列(局部) 绿色像素占50%,红色和蓝色各占25%

4.3 黑电平与暗电流

接下来聊一个容易被忽视但极其重要的概念——黑电平。

理想情况下,传感器完全遮光时,输出应该是0。但现实是,即使没有光,传感器也会产生微弱的电流,这就是暗电流。暗电流导致输出不为0,这个偏移量就是黑电平。

黑电平的典型值:

  • 8-bit RAW:通常偏移16~64
  • 10-bit RAW:通常偏移64~256
  • 12-bit RAW:通常偏移256~1024

为什么要校正黑电平?我举个例子:假设一个10-bit传感器,黑电平是64。如果某个像素在暗场下读出值是70,那实际信号只有6个LSB。如果不减去64,后续的增益、白平衡都会放大这个偏移,导致暗部发灰、偏色。

核心公式:
校正后像素值 = RAW原始值 - 黑电平值
注意:校正后可能出现负值,需要做截断或钳位处理。

暗电流受温度影响很大。温度每升高6~8°C,暗电流大约翻一倍。这就是为什么手机拍夜景时,暗部噪点会明显增多——传感器温度升高了。

我曾经踩过的坑:在一个车载项目中,我们用了某款传感器,黑电平在常温下是64,但到了夏天车内温度70°C时,黑电平漂移到了120。结果夜间图像全是紫色偏色。后来我们加了动态黑电平校正——实时从光学黑像素(OB像素)中提取当前黑电平值,才彻底解决。

黑电平校正的常见方法:

  1. 固定值减法:最简单,但温度适应性差。
  2. OB像素统计法:传感器边缘有遮光的像素,用它们的平均值作为黑电平。
  3. 行/列相关校正:考虑不同行或列的暗电流差异。

4.4 RAW数据的动态范围

动态范围,简单说就是传感器能同时记录的最亮和最暗细节的能力。单位是dB或档位(stops)。

计算公式:

动态范围(dB) = 20 × log10(满阱容量 / 读出噪声)

其中:
- 满阱容量:像素能容纳的最大电子数
- 读出噪声:读出电路引入的噪声(均方根值)

举个例子:一个传感器满阱容量为60000个电子,读出噪声为5个电子,那么:

动态范围 = 20 × log10(60000 / 5) = 20 × log10(12000) ≈ 81.6 dB

81.6 dB大约相当于13.6档。这意味着传感器能同时记录从最暗到最亮约13.6档光圈的细节。

影响动态范围的因素:

  • 位深:12-bit比10-bit多4倍量化级数,但动态范围还受模拟端限制。
  • 像素尺寸:大像素满阱容量大,动态范围更高。
  • 读出噪声:噪声越低,暗部细节越丰富。
  • 双增益/多增益技术:现代传感器通过高低增益两次读出,合成高动态范围。
我的建议:评估传感器时,别只看位深。我见过12-bit传感器动态范围只有60dB,也见过10-bit传感器做到75dB。关键看满阱容量和读出噪声这两个模拟指标。数字位深只是量化精度,模拟端才是瓶颈。

最后,用一张图总结本章的知识体系:

RAW数据格式知识体系 RAW数据格式 位深与存储 8/10/12/14/16-bit MIPI打包 / 字节对齐 压缩 vs 无损 Bayer模式 RGGB / GBRG / BGGR / GRBG 2×2重复单元 绿色占50% 黑电平与暗电流 暗电流产生偏移 OB像素校正 温度漂移补偿 动态范围 满阱容量 / 读出噪声 / 双增益