1. RAW域基础:什么是RAW图像、RAW与RGB的区别、拜耳阵列原理、RAW数据格式解析
各位同学好,我是你们这门课的主讲。在手机影像和计算摄影这个行当里摸爬滚打了十几年,我越来越觉得——不懂RAW,就别谈画质。
今天咱们就从最底层开始,把RAW域的基础打扎实。你想想看,为什么专业摄影师死活要拍RAW?为什么ISP流水线里第一个模块就是RAW处理?说白了,因为RAW才是传感器“看到”的原始世界,而JPEG或者RGB,已经是经过大量加工后的“二手信息”了。
1.1 什么是RAW图像
RAW不是一种文件格式的缩写,它就是一个英文单词——“原始”。在图像领域,RAW图像就是图像传感器(CMOS/CCD)输出的、未经任何处理的原始数据。
我打个比方:
传感器就像一台录音机,RAW就是它录下来的原始音频波形。而JPEG呢?是已经帮你混音、压缩、加了特效的MP3。你想做后期修音?MP3基本没戏,但波形文件随便折腾。
核心特征:
- 线性数据:RAW的像素值与场景亮度呈线性关系,没有经过Gamma校正
- 高位深:通常是10bit、12bit、14bit,甚至16bit(JPEG只有8bit)
- 单通道:每个像素只记录一种颜色分量(R/G/B之一),不是全彩色
- 无白平衡:没有做任何色彩校正,色温信息是原始的
我记得刚入行时,带我的老工程师说过一句话,我一直记到现在:“RAW是传感器的良心,JPEG是厂商的审美。” 嗯,话糙理不糙。
1.2 RAW与RGB的区别
很多初学者会问:RAW不也是RGB吗?错了,差远了。
咱们直接看对比表:
| 对比维度 | RAW图像 | RGB图像(如JPEG/TIFF) |
|---|---|---|
| 数据来源 | 传感器直接输出 | 经过ISP管线处理后的结果 |
| 色彩空间 | 传感器原生色彩空间(非标准) | sRGB / Adobe RGB / Display P3 等标准空间 |
| 位深 | 10~16bit | 8bit(常见) |
| 像素排列 | 拜耳阵列(马赛克状) | 每个像素包含完整的R/G/B三通道 |
| 动态范围 | 高(保留高光和阴影细节) | 低(经过色调映射,信息有损) |
| 文件大小 | 大(无损或轻微压缩) | 小(有损压缩为主) |
| 后期调整空间 | 极大(曝光、白平衡、降噪均可大幅调整) | 极小(稍微拉曲线就出现断层和噪点) |
我的经验: 做多帧合成时,我强烈建议在RAW域操作。为什么?因为RGB域已经做过Gamma校正和色调映射,像素间的线性关系被破坏了。你在RGB域做平均或加权融合,结果往往是错的。我曾经踩过这个坑,后来老老实实回到RAW域,效果立竿见影。
1.3 拜耳阵列原理
好,接下来咱们聊聊拜耳阵列。这是理解RAW数据的关键。
为什么传感器不能直接输出全彩色?因为每个像素的感光单元本身是“色盲”的——它只能感知光的强度,分不清颜色。那怎么办?在像素表面覆盖一层彩色滤光片(Color Filter Array, CFA),让每个像素只接收特定波长的光。
拜耳阵列是最经典的CFA模式,由柯达的Bryce Bayer在1976年发明。它的排列规律是:
- 50% 绿色(G):因为人眼对绿色最敏感
- 25% 红色(R)
- 25% 蓝色(B)
典型的2×2单元排列:
R G
G B
或者另一种常见变体:
G R
B G
这两种本质上是一样的,只是起始相位不同。行业内分别称为RGGB和GRBG模式。
下面我用一张SVG图把拜耳阵列的结构和RAW数据到RGB的转换流程画清楚:
避坑指南: 我曾经在处理一个夜景多帧合成项目时,直接在RGB域做对齐和融合,结果发现边缘出现大量彩色伪影。后来排查才发现——RGB域的G通道已经包含了插值信息,再做融合会放大插值误差。正确的做法是在RAW域(拜耳阵列原始格式)做对齐,融合完成后再做去马赛克。这个教训让我多花了两周时间返工。
1.4 RAW数据格式解析
不同厂商的RAW格式五花八门,但底层逻辑大同小异。咱们以最常见的DNG(Digital Negative)格式为例,看看RAW文件里到底装了啥。
一个标准的RAW文件包含以下几个核心部分:
- 图像数据(Image Data):就是拜耳阵列的原始像素值,通常经过无损或轻微压缩
- 元数据(Metadata):包括传感器型号、ISO、快门速度、光圈等拍摄参数
- 黑电平(Black Level):传感器在无光照时的输出值,用于后续校正
- 白平衡增益(White Balance Gains):R、G、B通道各自的增益系数
- 色彩矩阵(Color Matrix):从传感器原生色彩空间转换到标准色彩空间的矩阵
- 镜头校正参数:包括暗角、畸变、色差等校正数据
下面是一个简化的RAW数据读取和解析流程:
// 伪代码:RAW数据解析流程
raw_data = read_file("image.dng");
// 1. 提取元数据
metadata = parse_tiff_ifd(raw_data);
sensor_model = metadata["UniqueCameraModel"];
iso = metadata["ISOSpeedRatings"];
black_level = metadata["BlackLevel"]; // 通常是[64, 64, 64, 64]
white_level = metadata["WhiteLevel"]; // 例如 4095 (12bit)
// 2. 提取拜耳阵列图像数据
bayer_data = extract_bayer(raw_data, metadata["TileOffsets"]);
// 3. 黑电平校正
bayer_data = max(bayer_data - black_level, 0);
// 4. 应用白平衡增益
wb_gains = metadata["AsShotNeutral"]; // 例如 [0.5, 1.0, 0.8]
bayer_data = apply_white_balance(bayer_data, wb_gains, bayer_pattern);
// 5. 去马赛克
rgb_image = demosaic(bayer_data, bayer_pattern);
// 6. 色彩空间转换
color_matrix = metadata["ColorMatrix1"];
rgb_image = apply_color_matrix(rgb_image, color_matrix);
// 7. Gamma校正 + 色调映射 → 输出显示图像
output = gamma_correction(rgb_image, 2.2);
实用技巧: 我习惯在解析RAW时先检查黑电平值。不同ISO下黑电平可能不同,有些传感器还会做“黑电平漂移补偿”。如果你发现RAW图像整体偏亮或偏暗,十有八九是黑电平没减对。另外,白平衡增益最好用“AsShotNeutral”标签里的值,而不是随便猜一个。
1.5 常见RAW格式一览
| 格式 | 厂商 | 扩展名 | 特点 |
|---|---|---|---|
| DNG | Adobe(开放标准) | .dng | 跨平台、开源、包含完整元数据 |
| CR2 / CR3 | Canon | .cr2 / .cr3 | 佳能专有格式,CR3为最新版本 |
| NEF | Nikon | .nef | 尼康专有,支持无损压缩 |
| ARW | Sony | .arw | 索尼专有,压缩算法较复杂 |
| RAF | Fujifilm | .raf | 富士专有,X-Trans传感器使用 |
| RAW | 手机/模组厂商 | .raw / .10.raw | 通常为裸数据,无标准元数据 |
做手机影像的朋友要注意:很多手机厂商输出的“RAW”其实是经过预处理的RAW——比如已经做了黑电平校正、甚至做了简单的去噪。这种数据严格来说叫“processed RAW”,和相机直出的纯RAW有区别。我在做算法移植时经常遇到这个问题,一定要先搞清楚数据链路。
1.6 本章小结
好,咱们把这一章的核心内容捋一遍:
- RAW图像是传感器的原始输出,线性、高位深、单通道马赛克结构
- RAW vs RGB:RAW是“毛坯房”,RGB是“精装修”,后期空间天差地别
- 拜耳阵列:RGGB/GRBG模式,绿色占一半,红蓝各四分之一
- RAW格式:包含图像数据+元数据+校正参数,解析时注意黑电平和白平衡
这些基础概念,后面每一章都会用到。尤其是做多帧合成和RAW域增强时,不理解拜耳阵列的结构,你连像素对齐都做不对。嗯,今天就到这儿,大家先把这些消化掉。