1. RAW 域基础:从光子到数字的起点

做图像处理这些年,我越来越觉得——不懂 RAW,就别谈画质。很多朋友拿着手机或相机拍出来的 JPEG,调色、降噪、锐化,折腾半天效果还是不行。为什么?因为 JPEG 已经把传感器原始信息扔掉了大半。你想想看,巧妇难为无米之炊嘛。

这一章,我们就从 RAW 的源头讲起。我会带你看看 CMOS 传感器到底怎么干活,Bayer 阵列为什么长这样,以及 RAW 文件里到底藏了些什么。

1.1 什么是 RAW 图像

RAW 不是一种具体的文件格式,而是一类数据的统称。它记录的是图像传感器每个像素点未经处理的原始电压值。说白了,就是传感器「看到」什么,RAW 就记什么,不做任何美化。

RAW 的核心特征:

  • 线性数据:像素值与场景亮度呈线性关系,没有经过 Gamma 校正
  • 高位深:通常 10bit、12bit、14bit,甚至 16bit
  • 未去马赛克:每个像素只记录一种颜色分量(R/G/B 之一)
  • 无白平衡:没有做任何色彩校正
  • 无降噪:原始噪声全部保留

我刚开始做 ISP 时,犯过一个低级错误——拿 RAW 数据直接当 RGB 显示,结果画面全是黑白相间的格子。嗯,当时还以为传感器坏了。后来才明白,RAW 必须经过去马赛克(Demosaic)才能变成我们看到的彩色图像。

1.2 CMOS 传感器工作原理

现在市面上绝大多数图像传感器都是 CMOS(互补金属氧化物半导体)。它的工作原理,我习惯用一句话概括:光子 → 电子 → 电压 → 数字码。

具体流程是这样的:

  1. 光电转换:每个像素上的光电二极管吸收光子,产生电子-空穴对
  2. 电荷积累:电子被收集在势阱中,曝光时间越长,积累的电子越多
  3. 电荷读出:通过行选通和列选通,逐行读出每个像素的电压值
  4. 模数转换:ADC 将模拟电压转换为数字码(DN, Digital Number)

一个关键参数:满阱容量(Full Well Capacity)

每个像素能容纳的最大电子数。比如一个像素满阱容量是 30000 e⁻,那它最多只能存 30000 个电子。超过这个数,电子就会溢出到相邻像素——这就是高光溢出(Blooming)。我在调试一款安防摄像头时,就遇到过路灯周围全是白色拖尾,后来发现是满阱容量太小,曝光时间又长,高光区域直接「炸」了。

CMOS 传感器还有一个重要特性——读出噪声。每次读出电压时,电路都会引入一些随机噪声。这直接决定了传感器的动态范围和信噪比。

1.3 Bayer 阵列模式

单个像素只能感知光的强度,分不清颜色。那怎么拍出彩色照片?答案是在像素表面覆盖彩色滤光片(CFA, Color Filter Array)。最经典的就是 Bayer 阵列。

Bayer 阵列是 Bryce Bayer 在 1976 年提出的。它的排列规律是:

  • 50% 绿色(G)—— 因为人眼对绿色最敏感
  • 25% 红色(R)
  • 25% 蓝色(B)

典型的 2×2 单元排列:

R  G
G  B

也就是说,每 4 个像素中,有 2 个绿色、1 个红色、1 个蓝色。整个传感器就是这种 2×2 单元不断重复。

注意:Bayer 不是唯一的 CFA 模式

还有 X-Trans(富士)、Quad Bayer(手机多合一像素)、RGBW 等。但 Bayer 是工业界最通用的标准,我们这门课也以 Bayer 为主。

为什么绿色多一倍?我举个例子你就明白了。假设你有一张黑白照片,人眼对绿色区域的细节最敏感。如果绿色采样点太少,去马赛克后绿色通道的锯齿和伪色就会特别明显。Bayer 用双倍绿色像素,就是为了保证亮度细节的还原质量。

下面这张图展示了 Bayer 阵列在传感器上的布局:

Bayer 阵列传感器结构 CMOS 传感器感光区域 放大区域 R G R G G B G B R G R G G B G B R(红色,25%) G(绿色,50%) B(蓝色,25%) 每个像素只记录一种颜色分量,最终彩色图像需要去马赛克插值重建

1.4 RAW 文件格式解析

不同相机厂商的 RAW 格式各不相同:

厂商 扩展名 特点
佳能 .CR2 / .CR3 CR3 采用更紧凑的容器格式
尼康 .NEF 支持无损压缩
索尼 .ARW 压缩算法较复杂
富士 .RAF X-Trans CFA,非 Bayer
徕卡 .DNG Adobe 开放标准,很多厂商也支持
通用 .DNG 开源、可跨平台

虽然扩展名不同,但 RAW 文件内部结构大同小异。我以 DNG 为例,拆开给你看:

RAW 文件结构(以 DNG 为例)
├── 文件头(TIFF Header)
│   ├── 字节序标记(II 或 MM)
│   └── 指向第一个 IFD 的偏移
├── IFD(Image File Directory)
│   ├── 图像宽度、高度
│   ├── 位深(BitsPerSample)
│   ├── CFA 模式(CFAPattern)
│   ├── 白平衡参考(AsShotNeutral)
│   ├── 黑电平(BlackLevel)
│   └── 白电平(WhiteLevel)
├── 缩略图(Thumbnail Image)
└── RAW 图像数据(Tile/Strip 组织)
    └── 每个像素的原始 DN 值

黑电平(Black Level)和白电平(White Level)

这两个参数非常重要。黑电平是传感器在完全无光时的输出值(通常不是 0),白电平是传感器能输出的最大值(比如 12bit 的 4095)。我调试 ISP 时,第一步就是读这两个值,否则后续的增益和色彩校正全都会偏。

举个例子,假设你有一个 12bit 的 RAW 图像:

  • 黑电平 = 512(意味着暗电流导致的基础偏移)
  • 白电平 = 4095(12bit 最大值)
  • 有效动态范围 = 4095 - 512 = 3583

如果你直接拿 RAW 值做处理,不减去黑电平,暗部会发灰,亮部会提前饱和。我曾经接手过一个项目,前同事没做黑电平校正,结果整个画面的对比度都不对,调了两个月参数都没救回来——最后发现是 RAW 数据根本没「归零」。

1.5 为什么 ISP 要从 RAW 开始

你可能要问:现在手机和相机直出的 JPEG 已经很好了,为什么还要折腾 RAW?

原因很简单:RAW 保留了最多的信息,给了你最大的处理自由度。

  • 动态范围:RAW 的 12-14bit 比 JPEG 的 8bit 多出几十倍亮度层级
  • 白平衡:RAW 可以后期任意调整色温,JPEG 调色温会断层
  • 降噪:RAW 域的噪声模型更简单,去噪效果更好
  • 锐化:RAW 域做锐化不会放大 JPEG 压缩伪影

一句话总结:

JPEG 是「做好的菜」,RAW 是「菜市场买回来的新鲜食材」。你想做川菜还是粤菜,全看你的手艺。而 ISP 工程师,就是那个决定怎么做菜的人。