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 | 较少见,需注意 |
这里有个细节: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];
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- | 越低越好,影响暗部画质 |
动态范围还和位深直接相关。理论上,RAW10能表示0~1023共1024个灰度级,动态范围约60dB。RAW12能表示0~4095共4096个灰度级,动态范围约72dB。但实际中,Sensor的模拟动态范围往往小于量化动态范围,所以提高位深并不能无限提升动态范围。
我记得有一次调试一个暗光场景,RAW10的图像暗部全是条纹噪声。后来发现是黑电平没校准好,减多了导致暗部被截断。把黑电平调准之后,暗部细节就出来了。嗯,这里要注意:黑电平减多了会丢暗部细节,减少了会偏色,必须精确。
最后说一句,RAW图是ISP的原材料。原材料质量决定了成品的天花板。Bayer Pattern读对了,RAW格式解包对了,黑电平校准准了,后面的处理才有意义。否则,再牛的算法也救不回来。