1. RAW格式解析:RAW文件结构、Bayer阵列模式、黑电平与白平衡基础、RAW数据的位深与动态范围
各位同学,欢迎来到第一节课。咱们直接切入正题——RAW格式。很多人拍了几年RAW,其实并不清楚文件里到底存了什么。我刚开始做图像处理时也踩过这个坑,以为RAW就是“没压缩的图片”。后来被项目逼着去读传感器手册,才发现完全不是那么回事。
说白了,RAW就是传感器“看到”的原始电荷量记录。它还没被渲染成你肉眼看到的彩色照片。你想想看,相机里的CMOS其实是个色盲——它只感知光的强度,不感知颜色。那彩色是怎么来的?这就得从文件结构说起了。
1.1 RAW文件结构:不只是像素数据
一个标准的RAW文件,其实是个容器。里面至少包含三部分:
- 文件头(Header):相机型号、传感器尺寸、ISO、快门速度、白平衡预设等元数据。我遇到过最坑的一次,就是文件头损坏导致整批照片无法解码——从那以后我养成了校验头部的习惯。
- 图像数据(Image Data):真正的传感器原始值,按Bayer模式排列。这部分占了文件体积的90%以上。
- 缩略图/预览图(Thumbnail/Preview):相机内部生成的JPEG预览,方便你在屏幕上快速浏览。注意,这个预览图已经做过白平衡和Gamma校正了,和RAW数据本身不是一回事。
关键认知:RAW不是图像,是数据。它需要经过“去马赛克(Demosaic)”、“白平衡”、“颜色校正”、“Gamma映射”等一系列步骤,才能变成你看到的照片。我见过不少新手直接拿RAW当“无损TIFF”用,结果颜色怎么调都不对——因为你跳过了必要的解码流程。
1.2 Bayer阵列模式:传感器如何“看”颜色
CMOS传感器上的每个像素只能记录亮度值。为了获取彩色信息,工程师在像素表面覆盖了一层彩色滤光片阵列(CFA)。最经典的就是Bayer阵列。
Bayer阵列的排列规律是:每2x2的像素块中,有1个红色(R)、1个蓝色(B)、2个绿色(G)。为什么绿色占一半?因为人眼对绿色最敏感。这个设计很巧妙——用更多的绿色像素来模拟人眼的亮度感知。
// 典型的Bayer RGGB模式排列
// 每个字母代表一个像素的滤光片颜色
// 实际存储的是该像素的原始亮度值
R G R G R G
G B G B G B
R G R G R G
G B G B G B
我个人习惯把Bayer数据想象成一个“打了马赛克的灰度图”。每个像素只有一个颜色通道的值,另外两个通道是缺失的。后续的“去马赛克”算法就是根据相邻像素来插值补全这些缺失值。
实战经验:不同厂商的Bayer排列可能不同。索尼常用RGGB,三星有时用GBRG,富士的X-Trans更复杂。我在做多相机融合项目时,就曾因为搞混了Bayer排列顺序,导致整批图像颜色错乱——排查了整整两天。所以,拿到RAW数据第一件事:确认Bayer模式。
1.3 黑电平与白平衡基础
这两个概念是RAW解码的基石,也是很多HDR噪声处理绕不开的起点。
黑电平(Black Level):传感器在完全无光(盖上镜头盖)时,理论上应该输出0。但实际电路有暗电流和读出噪声,所以会有一个非零的底值。这个底值就是黑电平。解码时,必须先把所有像素值减去黑电平,才能得到真实的信号量。
我举个例子:假设黑电平是512(12-bit RAW),那么像素值512对应的是“纯黑”,而不是0。如果不做黑电平校正,暗部会偏色,而且噪声会被放大。
白平衡(White Balance):不同光源的色温不同,传感器对RGB三个通道的响应也不一样。白平衡的目的就是让中性灰(18%灰卡)在三个通道上输出相等的值。具体做法是给R和B通道乘上增益系数,G通道通常作为参考保持不变。
| 光源类型 | 色温(K) | 典型R增益 | 典型B增益 |
|---|---|---|---|
| 日光 | 5500 | 1.0 | 1.0 |
| 白炽灯 | 3200 | 1.8 | 0.6 |
| 荧光灯 | 4000 | 1.4 | 0.8 |
| 阴天 | 6500 | 0.9 | 1.2 |
注意:白平衡增益会放大噪声。尤其是蓝色通道增益较大时(如白炽灯下B增益只有0.6,但R增益1.8),红色通道的噪声会被明显放大。这就是为什么暗光下红色噪点特别明显的原因。我曾经在低光照项目中,因为白平衡增益设置不当,导致红色通道的SNR下降了6dB——后来改用多帧融合才压住。
1.4 RAW数据的位深与动态范围
位深决定了每个像素能记录多少个灰度级。8-bit是256级,10-bit是1024级,12-bit是4096级,14-bit是16384级。你想想看,8-bit的JPEG在天空渐变时容易出现色带,而14-bit RAW就能平滑过渡——这就是位深的威力。
但位深不等于动态范围。动态范围是传感器能记录的最亮信号与最暗信号的比值,单位是dB或档(EV)。
// 动态范围计算示例(假设14-bit RAW,黑电平512)
// 最大信号值 = 2^14 - 1 = 16383
// 有效信号范围 = 16383 - 512 = 15871
// 动态范围(dB)= 20 * log10(15871 / 1) ≈ 84dB
// 换算成档位:84 / 6 ≈ 14 EV
实际传感器的动态范围受读出噪声限制。高端相机能做到14-15 EV,手机传感器通常在10-12 EV。HDR合成的核心思想,就是用多帧不同曝光的RAW数据,拼出一张超过单帧动态范围的照片。
核心公式:动态范围(EV)= log2(满阱容量 / 读出噪声)。满阱容量越大,读出噪声越低,动态范围越高。这也是为什么大像素(大像元尺寸)在暗光下表现更好——物理规律决定的。
1.5 本章知识结构图
下面这张图把RAW格式的核心概念串起来了。从传感器捕获到最终解码,每一步都对应着本章讲的知识点。
这张图把本章的四个核心模块串在了一起。你可以看到,RAW文件结构是容器,Bayer阵列是数据组织方式,黑电平与白平衡是预处理步骤,位深与动态范围是最终性能指标。HDR噪声抑制的每一步,都建立在对这些基础概念的准确理解上。
我的建议:如果你手头有相机,可以拍一张RAW照片,用dcraw或libraw工具把它解码成16-bit TIFF,然后逐像素观察Bayer模式下的原始值。亲眼看到黑电平偏移和白平衡增益的效果,比读十篇文章都管用。我当年就是这么入门的。