3. RAW图基础与Bayer格式:Bayer Pattern详解、RAW10/RAW12/RAW16数据格式、黑电平与动态范围

好,我们进入第三章。这一章讲的是ISP管线的起点——RAW图。说白了,就是传感器直接吐出来的原始数据,还没经过任何美化。你想想看,如果连RAW图都搞不清楚,后面那些去噪、插值、色彩校正全都是空中楼阁。

我个人习惯,每接触一款新Sensor,第一件事就是看它的Bayer Pattern和RAW位深。这两个参数决定了后面整个ISP流程怎么走。咱们一个一个来拆。

3.1 Bayer Pattern详解

为什么传感器不直接输出RGB全彩图?因为单个像素只能感知光的强度,分不清颜色。那怎么办?在像素表面盖一层滤色片,让每个像素只通过一种颜色。最常见的排列就是Bayer Pattern。

Bayer Pattern的核心思想:用2x2的单元重复排列。每个单元里,绿色占两个,红色和蓝色各一个。为什么绿色多?因为人眼对绿色最敏感,多采样绿色能提升视觉分辨率。

Pattern类型 排列方式 常见应用
BGGR 第一行B G,第二行G R Sony IMX系列
RGGB 第一行R G,第二行G B OmniVision、三星
GRBG 第一行G R,第二行B G 部分安森美Sensor
GBRG 第一行G B,第二行R G 较少见,需注意
避坑指南: 我曾经在一个项目里,Sensor规格书写的RGGB,结果驱动配置成了BGGR。出来的图像偏色严重,排查了两天才发现是Pattern配反了。记住:Bayer Pattern错了,后面所有颜色处理都是错的。

这里有个细节:Bayer Pattern的起始位置(Phase)也很关键。Sensor输出的第一行第一列是什么颜色?这个信息必须从Sensor的寄存器配置里读出来,不能靠猜。

3.2 RAW10 / RAW12 / RAW16 数据格式

Bayer Pattern决定了像素的排列,而位深决定了每个像素用多少比特来表示。常见的RAW格式有RAW10、RAW12、RAW16。位深越大,能表示的亮度层级越多,动态范围理论上也越大。

但这里有个坑:位深和存储格式是两回事。RAW10不是说每个像素占10个bit就完事了,它涉及到怎么把这10个bit塞进内存里。

格式 位深 存储方式 每像素实际占用
RAW10 10 bit 4个像素打包成5字节 1.25 字节
RAW12 12 bit 2个像素打包成3字节 1.5 字节
RAW16 16 bit 每个像素独立2字节 2 字节

举个例子,RAW10的打包方式:4个10bit的数据,总共40bit,正好5个字节。第一个字节存第一个像素的高8位,第二个字节存第一个像素的低2位+第二个像素的高6位……以此类推。拆包的时候要按位操作,挺麻烦的。

// RAW10 解包示例(C语言伪代码)
// 输入:packed[5] 包含4个RAW10像素
// 输出:pixel[4] 每个值范围0-1023

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];
我的经验: 在嵌入式平台上,RAW10解包用查表法比位运算快。提前算好所有可能的字节组合对应的像素值,运行时直接查表。代价是多占一点ROM,但能省下宝贵的CPU周期。

RAW12的打包类似,2个像素占3字节。RAW16最简单,每个像素直接占2字节,低4位通常是0填充。为什么会有RAW16?因为很多ISP内部处理路径是16bit的,Sensor输出RAW12后,ISP会左移4位变成RAW16再做后续处理。

3.3 黑电平与动态范围

黑电平(Black Level)这个概念,很多初学者容易忽略。传感器在没有光照的时候,理论上输出应该是0。但实际上,由于暗电流、电路噪声等原因,输出会有一个偏移量。这个偏移量就是黑电平。

黑电平的作用:把有效信号从噪声中抬起来。如果不减掉黑电平,暗部细节会被压缩,动态范围也会受影响。

动态范围(Dynamic Range)的定义:传感器能同时记录的最亮信号与最暗信号的比值。单位是dB。公式很简单:

DR = 20 * log10(满阱容量 / 噪声底噪)

举个例子,一个RAW10的Sensor,满阱容量是10000个电子,读出噪声是10个电子。那么它的动态范围就是20 * log10(10000/10) = 60dB。这大概相当于10档光圈。

参数 典型值 说明
黑电平(RAW10) 64 10bit下,64对应约6%的满量程
黑电平(RAW12) 256 12bit下,256对应约6.25%的满量程
满阱容量 10000~30000 e- 取决于像素尺寸和工艺
读出噪声 2~15 e- 越低越好,影响暗部画质
关键点: 黑电平校准是ISP的第一步。Sensor出厂时会有默认的黑电平值,但实际使用中会随温度、增益变化。好的ISP会在每一帧开始前,从光学黑区(OB,Optical Black)像素中实时计算黑电平,然后做减法。

动态范围还和位深直接相关。理论上,RAW10能表示0~1023共1024个灰度级,动态范围约60dB。RAW12能表示0~4095共4096个灰度级,动态范围约72dB。但实际中,Sensor的模拟动态范围往往小于量化动态范围,所以提高位深并不能无限提升动态范围。

我记得有一次调试一个暗光场景,RAW10的图像暗部全是条纹噪声。后来发现是黑电平没校准好,减多了导致暗部被截断。把黑电平调准之后,暗部细节就出来了。嗯,这里要注意:黑电平减多了会丢暗部细节,减少了会偏色,必须精确。

RAW图基础与Bayer格式知识体系 RAW图基础 Bayer Pattern RAW数据格式 黑电平与动态范围 RGGB / BGGR / GRBG / GBRG 2x2单元重复排列 绿色占50%提升分辨率 RAW10: 4像素打包5字节 RAW12: 2像素打包3字节 RAW16: 每像素独立2字节 暗电流导致非零偏移 动态范围 = 满阱/噪声 OB区实时校准黑电平 核心逻辑:Bayer Pattern决定排列 → RAW格式决定位深与存储 → 黑电平校准决定动态范围利用率 三者共同构成ISP管线的输入基础,任何一环出错都会影响最终图像质量
实用技巧: 调试黑电平时,盖上镜头盖拍一张全黑图。统计所有像素的均值,这个值就是当前的黑电平。如果不同颜色通道的黑电平不一致,还需要分别校准,这叫通道间黑电平非均匀性校正。

最后说一句,RAW图是ISP的原材料。原材料质量决定了成品的天花板。Bayer Pattern读对了,RAW格式解包对了,黑电平校准准了,后面的处理才有意义。否则,再牛的算法也救不回来。