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的转换流程画清楚:

拜耳阵列原理与RAW→RGB转换流程 拜耳阵列(2×2单元) R G G B 每个像素只记录 一种颜色分量 RAW 数据 [R, G, G, B] 线性、高位深 单通道马赛克 去马赛克 Demosaic 插值算法 补全缺失像素 RGB 全彩色 3通道 关键知识点 1. 拜耳阵列中绿色像素占50%,红色和蓝色各占25% 2. RAW数据是“马赛克”状的,每个位置只有一种颜色 3. 去马赛克(Demosaic)通过插值算法补全缺失的R/G/B分量 4. 常见的插值算法:双线性插值、边缘导向插值、自适应插值 5. 去马赛克质量直接影响最终图像的锐度和伪色(False Color)

避坑指南: 我曾经在处理一个夜景多帧合成项目时,直接在RGB域做对齐和融合,结果发现边缘出现大量彩色伪影。后来排查才发现——RGB域的G通道已经包含了插值信息,再做融合会放大插值误差。正确的做法是在RAW域(拜耳阵列原始格式)做对齐,融合完成后再做去马赛克。这个教训让我多花了两周时间返工。

1.4 RAW数据格式解析

不同厂商的RAW格式五花八门,但底层逻辑大同小异。咱们以最常见的DNG(Digital Negative)格式为例,看看RAW文件里到底装了啥。

一个标准的RAW文件包含以下几个核心部分:

  1. 图像数据(Image Data):就是拜耳阵列的原始像素值,通常经过无损或轻微压缩
  2. 元数据(Metadata):包括传感器型号、ISO、快门速度、光圈等拍摄参数
  3. 黑电平(Black Level):传感器在无光照时的输出值,用于后续校正
  4. 白平衡增益(White Balance Gains):R、G、B通道各自的增益系数
  5. 色彩矩阵(Color Matrix):从传感器原生色彩空间转换到标准色彩空间的矩阵
  6. 镜头校正参数:包括暗角、畸变、色差等校正数据

下面是一个简化的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域增强时,不理解拜耳阵列的结构,你连像素对齐都做不对。嗯,今天就到这儿,大家先把这些消化掉。