1、RAW域基础:从传感器到数字底片
做图像处理这些年,我经常被问到同一个问题:「RAW到底是什么?跟JPEG有啥区别?」
嗯,这个问题其实挺关键的。如果你不理解RAW,后面所有ISP流程都像在盖空中楼阁。今天我们就从最底层开始,把RAW的底裤扒干净。
1.1 什么是RAW图像?
说白了,RAW就是传感器直接输出的原始数据。它还没经过任何处理——没做白平衡、没做去马赛克、没做伽马校正。你可以把它想象成「数字底片」。
我习惯这样跟新人解释:
- JPEG = 厨师做好的菜,直接吃就行
- RAW = 菜市场买回来的生食材,你想怎么料理都行
为什么ISP工程师必须跟RAW打交道?因为只有RAW保留了传感器捕获的全部信息。我在项目中遇到过很多次,客户拿JPEG来做后期调色,结果暗部一拉就全是色块——信息早就被压缩丢了。RAW就不一样,12bit的数据量是8bit JPEG的16倍,后期空间大得多。
核心要点:RAW是线性的、未处理的传感器数据。它记录的是每个像素点的电荷量,不是人眼看到的颜色。
1.2 Bayer阵列模式
你可能会问:「传感器怎么感知颜色的?」
答案是——它其实分不清颜色。单个像素只能感知光的强度,不能区分红绿蓝。所以工程师们在像素表面盖了一层彩色滤光片,这就是Bayer阵列。
最常见的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 ...
为什么绿色像素是红色的两倍?因为人眼对绿色最敏感。这个设计从1976年延续到现在,算是个经典方案。
除了RGGB,还有几种常见变体:
| 模式 | 排列 | 特点 | 常见场景 |
|---|---|---|---|
| RGGB | 2×2单元,G占50% | 标准方案,兼容性好 | 绝大多数手机/相机 |
| RGBW | 用W替换部分G | 低光下灵敏度更高 | 安防监控、部分手机 |
| RCCC | R占25%,C占75% | 对红光敏感 | 车载摄像头、交通监控 |
| RCCB | R、C、C、B | 兼顾色彩和灵敏度 | 部分安防相机 |
个人经验:我曾经在一个安防项目里用了RGBW传感器,低光性能确实好,但去马赛克算法得重新写——W通道的处理跟RGB完全不同。如果你第一次用RGBW,建议先跑一遍仿真,别直接上硬件。
1.3 RAW数据存储格式
RAW数据的位深决定了你能记录多少灰阶。常见的就三种:
- 12bit:4096级灰阶。手机传感器的主流选择,数据量适中
- 14bit:16384级灰阶。单反/微单的标配,动态范围更好
- 16bit:65536级灰阶。工业相机/科学级应用,数据量翻倍
你想想看,12bit和16bit差了16倍的数据量。但实际处理时,很多ISP pipeline内部会用更高的位深做中间计算,最后再压缩输出。
存储格式上,有几种常见方案:
| 格式 | 说明 | 典型场景 |
|---|---|---|
| 纯RAW | 无压缩,逐像素存储 | 工业相机、科研 |
| MIPI RAW | 按MIPI协议打包,带帧头 | 手机传感器输出 |
| DNG | Adobe的开放RAW格式 | 后期软件通用 |
| 厂商私有格式 | .CR2、.NEF、.ARW等 | 各相机厂商 |
避坑指南:我曾经接手过一个项目,传感器输出的是10bit RAW,但DMA配置成了16bit读取。结果每个像素的高6位全是0,低10位才是有效数据。调了三天才发现是位宽对齐的问题。记住:RAW的位深和存储位宽是两回事。
1.4 RAW文件结构解析
一个完整的RAW文件,不只是像素数据。它通常包含三个部分:
- 文件头:包含图像尺寸、位深、Bayer模式、白平衡参数、相机型号等元数据
- 像素数据:实际的RAW像素值,按Bayer排列
- 缩略图:一张小尺寸JPEG,方便快速预览
以DNG格式为例,它的结构大致是这样:
DNG文件结构:
┌─────────────────────────┐
│ TIFF Header │ ← 文件头,标识DNG版本
├─────────────────────────┤
│ IFD 0 (主图像) │
│ ├── ImageWidth │ ← 宽度
│ ├── ImageLength │ ← 高度
│ ├── BitsPerSample │ ← 位深 (12/14/16)
│ ├── CFARepeatPattern │ ← Bayer模式 (RGGB等)
│ ├── BlackLevel │ ← 黑电平
│ ├── WhiteLevel │ ← 白电平
│ └── ... │
├─────────────────────────┤
│ RAW Pixel Data │ ← 实际的像素值
├─────────────────────────┤
│ IFD 1 (缩略图) │
│ └── JPEG数据 │
└─────────────────────────┘
读取RAW文件时,我建议按这个步骤来:
- 先解析文件头,拿到图像参数
- 根据Bayer模式确定像素排列
- 按位深读取像素数据(注意字节序!)
- 应用黑电平校正(如果有)
实用技巧:很多RAW文件的黑电平不是0。比如索尼的传感器,黑电平通常在512左右(12bit)。如果你直接拿原始数据做处理,暗部会偏绿。我习惯在读取阶段就把黑电平减掉,后面处理会省很多事。
1.5 本章知识结构图
下面这张图总结了RAW域的核心概念和它们之间的关系:
这张图把本章的核心内容串起来了。从RAW图像出发,左边是定义和特性,中间是Bayer阵列的各种模式,右边是存储位深,底部是文件结构。你在实际项目中遇到RAW相关的问题,都可以回到这张图上找定位。
本章小结:RAW是ISP pipeline的起点。理解Bayer模式决定了你怎么读数据,理解位深决定了你怎么存数据,理解文件结构决定了你怎么解析数据。这三件事搞清楚了,后面30章的路就好走了。