一、课程导论与RAW基础
1.1 什么是RAW格式?
各位同学好,我是这门课的主讲。在正式开始之前,我想先问大家一个问题:你手机或相机拍出来的照片,真的是「原始数据」吗?
答案是否定的。你看到的JPEG或者HEIC文件,其实已经经过了大量处理——白平衡、去马赛克、降噪、锐化、伽马校正……相机内部帮你做了一套完整的「后期流程」。而RAW格式,说白了就是把这些处理全部砍掉,只保留传感器最原始的电压读数。
我习惯把RAW比作「数字底片」。就像胶片时代的底片一样,它记录的是最原始的光信号,而不是最终的照片。每个像素点只记录一个颜色通道的强度——红色、绿色或蓝色,这叫做Bayer阵列。嗯,这里要注意,RAW不是一张完整的彩色图像,它是一堆单色像素的集合。
核心要点:RAW文件 = 传感器原始电压值 + 元数据(ISO、快门、光圈等)。它没有经过任何图像处理,是真正的「第一手数据」。
1.2 RAW与sRGB的区别
很多初学者会混淆这两个概念。我简单列个表,你一看就明白了:
| 对比维度 | RAW | sRGB |
|---|---|---|
| 位深度 | 12bit / 14bit(4096~16384级) | 8bit(256级) |
| 色彩空间 | 线性(与光强成正比) | 非线性(伽马校正) |
| 数据范围 | 0 ~ 16383(14bit) | 0 ~ 255 |
| 存储格式 | 单通道Bayer模式 | 三通道RGB |
| 处理状态 | 未处理 | 已处理(含降噪、锐化等) |
为什么会这样?你想想看,sRGB只有256个灰度级,而RAW有16384个。这意味着RAW能记录更细腻的明暗变化。我在项目中遇到过一个问题:用sRGB图像做去噪,暗部细节全被压缩到0~10这个区间,噪声和信号几乎无法区分。但换成RAW数据,暗部可能分布在0~200的范围内,信噪比明显更好。
个人经验:我曾经做过一个实验,把同一张RAW分别保存为sRGB和线性TIFF,然后训练两个去噪模型。结果RAW域训练的模型PSNR高出3dB以上。说白了,信息量决定了上限。
1.3 为什么在RAW域做去噪?
这个问题我经常被问到。我的回答很简单:因为噪声的「出生地」就在RAW域。
传感器上的噪声主要有几种:
- 读出噪声:读取电压时引入的电子噪声
- 散粒噪声:光子到达的随机性,服从泊松分布
- 暗电流噪声:热激发产生的电子
- 量化噪声:ADC转换时的舍入误差
这些噪声都是在RAW阶段产生的。一旦经过去马赛克、白平衡、伽马校正等处理,噪声的统计特性会被严重扭曲——它不再是简单的加性高斯噪声,而是变成了复杂的、空间相关的、非线性的噪声。这时候再去降噪,就像在打一个会变形的靶子,难度翻倍。
我建议所有做图像去噪的同学,都先问自己一个问题:我的噪声模型是什么?如果你连噪声的分布都不知道,那模型大概率是瞎蒙的。而在RAW域,噪声模型相对清晰——散粒噪声的方差等于信号强度,读出噪声是高斯分布。这些物理规律是可以数学建模的。
避坑指南:我曾经在sRGB域训练了一个看起来很漂亮的去噪网络,结果放到真实相机上效果一塌糊涂。后来排查发现,sRGB的伽马校正把暗部噪声放大了,而亮部噪声被压缩了,网络根本学不到统一的噪声模式。从那以后,我坚持在RAW域做去噪。
1.4 课程项目全景预览
这门课不是纯理论,我们会有完整的实战项目。下面这张图展示了整个课程的知识体系:
整个课程分为四个阶段:
- 基础篇(第1-8章):RAW格式解析、噪声建模、数据管线搭建。这部分我会带你手写一个RAW解析器,而不是用现成的库。
- 算法篇(第9-18章):从BM3D到深度学习,从U-Net到Transformer。每个模型我都会给出完整的PyTorch实现。
- 实战篇(第19-25章):用真实相机采集数据,训练模型,部署到移动端。这部分坑最多,我会把踩过的坑一一告诉你。
- 进阶篇(第26-30章):多帧融合、视频去噪、极端暗光场景。这些是工业级应用的核心。
我的建议:如果你刚开始接触RAW域去噪,不要急着跑大模型。先把第一章的基础打牢——理解Bayer阵列、黑电平、增益这些概念。我见过太多人模型跑得飞起,结果连RAW文件都读不对,最后效果差还找不到原因。