一、RAW图像基础:从传感器到数字底片

做图像处理这些年,我经常被问到同一个问题:「RAW到底是个什么东西?」 说白了,RAW就是相机传感器最原始的「读数记录」,未经任何加工。就像你从菜市场买回来的新鲜蔬菜,还没洗、没切、没下锅。

我个人习惯把RAW叫做「数字底片」。为什么?因为它和胶片时代的底片一样,保留了最完整的光信息。你后期怎么调色、怎么曝光补偿,它都能扛得住。

1.1 RAW与JPEG/TIFF的本质区别

先看一张对比表,你就明白了:

特性 RAW JPEG TIFF
数据本质 传感器原始电压值 经过白平衡、Gamma、压缩后的8位图像 可无损,但通常已做去马赛克
位深 12~14位(部分16位) 8位 8/16位
压缩方式 无损或视觉无损 有损(DCT量化) 无损(LZW/ZIP)
后期空间 极大,可调曝光±3EV 极小,调1EV就出断层 中等
文件大小 20~50MB(2400万像素) 5~10MB 50~150MB
适用场景 专业后期、高动态场景 快速分享、预览 印刷、存档

核心一句话:JPEG是相机帮你「煮熟」的菜,RAW是生鲜食材。你想做红烧还是清蒸,RAW说了算。

我记得有一次项目里需要从暗光视频中提取车牌信息。JPEG素材暗部全是色块和噪点,根本没法看。换成RAW采集后,硬是把暗部拉了3档曝光,车牌号码清晰可辨。嗯,这就是位深和动态范围带来的差距。

1.2 常见RAW文件扩展名

不同厂商的RAW格式,说白了就是各家「私房菜谱」。我整理了一份清单:

  • .CR2 / .CR3 — 佳能(Canon)。CR3是较新的封装,支持更高效的压缩。
  • .NEF — 尼康(Nikon)。尼康的RAW,早期带压缩选项。
  • .ARW — 索尼(Sony)。目前主流,压缩算法比较成熟。
  • .DNG — Adobe推出的「通用RAW」。我个人很喜欢这个格式,跨平台兼容性好。
  • .ORF — 奥林巴斯(Olympus)。
  • .RW2 — 松下(Panasonic)。
  • .RAF — 富士(Fujifilm)。富士的X-Trans传感器排列特殊,解码时要注意。

我的建议:如果你做算法开发,尽量用DNG作为中间格式。它开源、文档齐全,libraw和OpenCV都原生支持。我曾经被.CR3的加密搞到崩溃,后来统一转DNG,世界清净了。

1.3 RAW数据的位深与动态范围

这是整个RAW域预处理的核心。你想想看,为什么RAW能拉回过曝的天空?为什么JPEG一拉就断层?

位深(Bit Depth)决定了每个像素能记录多少级亮度。8位是256级,12位是4096级,14位是16384级。这不是简单的线性关系——每多1位,数据量翻倍。

我画了一张图,帮你理解位深和动态范围的关系:

位深与动态范围关系图 8位 JPEG:256级灰度,动态范围约8档 12位 RAW:4096级灰度,动态范围约12档 14位 RAW:16384级灰度,动态范围约14档 动态范围 = log₂(最大信号 / 噪声底噪) 14位RAW理论上可记录约84dB的动态范围 而8位JPEG只有约48dB

你可能会问:「动态范围大有什么用?」 我举个真实例子。有一次在逆光环境下拍人像,天空亮到过曝,人脸暗到死黑。JPEG直出的话,天空一片白,人脸一片黑,神仙难救。但用RAW拍摄,后期把高光拉回来、暗部提上去,天空有云彩细节,人脸肤色自然。这就是14位RAW的威力——它记录了传感器能捕捉到的所有光信息。

注意:位深高不等于画质好。我曾经遇到过一款相机,标称14位RAW,但噪声水平很高,实际有效动态范围只有10位。位深只是「容器」,传感器本身的信噪比才是关键。

1.4 RAW数据的存储结构

RAW文件不是一张「图片」,它是一个容器。里面装了什么?

  • Bayer阵列数据 — 真正的传感器读数,每个像素只记录R/G/B中的一个通道。
  • 元数据(EXIF) — 拍摄参数:ISO、快门、光圈、镜头信息、白平衡预设等。
  • 缩略图 — 相机内置JPEG预览图,方便快速浏览。
  • 黑电平校准数据 — 用于校正传感器暗电流噪声。
  • 镜头校正参数 — 暗角、畸变、色差等补偿数据。

我刚开始做RAW解码时,踩过一个坑:黑电平(Black Level)。很多初学者以为RAW的0就是纯黑,其实不是。传感器有暗电流,即使完全遮光,也会读出几百甚至上千的数值。如果不减去这个黑电平,暗部会偏色、发灰。

避坑指南:处理RAW的第一步,永远是读取黑电平并做减法。我曾经因为忘了这步,整批数据暗部偏紫,排查了三天才发现是黑电平没处理。

1.5 为什么做RAW域预处理?

你想想看,如果直接用JPEG做图像处理,相当于在「压缩过的、有损的、8位的」数据上操作。很多信息已经丢失了。而RAW域预处理,是在信息最完整的时候做操作:

  1. 去马赛克(Demosaic) — 把Bayer阵列恢复成全彩色。算法好坏直接影响分辨率和伪色。
  2. 白平衡校正 — 在RAW域做,不会损失色深。
  3. 去噪 — RAW域的噪声模型更简单,去噪效果更好。
  4. 色调映射 — 把高动态范围压缩到8位显示,保留更多细节。

我个人习惯把RAW域预处理叫做「黄金处理窗口」。一旦转成JPEG,很多信息就永远消失了。所以,如果你做计算机视觉、图像增强、计算摄影,一定要学会在RAW域操作。

一个小建议:初学者可以从libraw或OpenCV的cv::cvtColor开始,先读RAW、做黑电平校正、白平衡、去马赛克,看看每一步对最终图像的影响。亲手调一遍参数,比看十遍理论都管用。