1. 课程导论与成像基础
各位同学好。我是你们这门课的主讲。
做ISP算法这行十几年了,我见过太多人一上来就调参数、跑模型,结果连最基本的噪声从哪来的都说不清。嗯,这其实挺要命的。今天这第一讲,咱们先把地基打牢。你想想看,如果连相机怎么成像、噪声长什么样都不清楚,后面做多帧降噪和HDR合成,那不就成了瞎调吗?
1.1 为什么需要多帧降噪与HDR?
先说说这两个技术到底用在哪儿。我个人习惯把它们叫做“手机拍照的两大护法”。
- 多帧降噪:专门对付暗光场景。比如晚上拍夜景、室内灯光不足的时候。单帧拍出来全是噪点,糊成一片。多帧降噪就是拍多张,然后对齐、融合,把噪点压下去,把细节留下来。
- HDR合成:专门对付大光比场景。比如逆光拍人像,天空过曝、人脸死黑。HDR就是拍几张不同曝光量的照片,把亮部细节和暗部细节合成到一张图里。
核心观点: 多帧降噪解决的是“信噪比不够”的问题,HDR解决的是“动态范围不够”的问题。两者经常配合使用,但底层逻辑完全不同。
我在项目中遇到过不少团队,把这两个概念混为一谈。结果算法设计出来,暗光场景下HDR效果奇差,大光比场景下多帧降噪又没用。说白了,你得先搞清楚你要解决什么问题,再选工具。
1.2 相机成像模型:光是怎么变成数字信号的?
要理解噪声和动态范围,得先知道相机是怎么工作的。我画了一张图,帮你把整个流程串起来。
流程其实不复杂。场景光照通过镜头聚焦到传感器上,传感器把光信号转成电信号,ADC再把模拟电信号转成数字信号,最后ISP处理成我们能看到的图像。
但问题就出在传感器和ADC这两个环节。它们会引入噪声。而且,传感器的每个像素点能记录的光强范围是有限的,这就是动态范围的物理限制。
1.3 噪声模型:图像里的“雪花”从哪来?
噪声不是凭空出现的。我习惯把噪声分成两大类:
| 噪声类型 | 来源 | 特性 | 与信号的关系 |
|---|---|---|---|
| 散粒噪声 | 光子到达的随机性 | 服从泊松分布 | 与信号强度平方根成正比 |
| 读出噪声 | 传感器电路和ADC | 近似高斯分布 | 与信号强度无关 |
| 暗电流噪声 | 传感器热效应 | 随温度和时间增加 | 与曝光时间成正比 |
| 固定模式噪声 | 像素制造工艺差异 | 空间上固定 | 与信号强度成比例 |
实战经验: 我建议你在做多帧降噪时,重点关注散粒噪声和读出噪声。因为暗电流噪声可以通过短曝光控制,固定模式噪声可以通过标定消除。但散粒噪声是物理极限,只能靠多帧叠加来提升信噪比。
为什么会这样?你想想看,散粒噪声是光本身的量子特性决定的。光线越暗,光子越少,随机性就越明显。单帧图像里,暗部区域的信噪比可能只有几个dB。多帧降噪的本质,就是通过多次采样取平均,把随机噪声平滑掉。
我曾经在一个项目中,遇到暗光下图像全是彩色噪点。团队一开始以为是传感器坏了,折腾了两周。后来我让他们测了一下不同曝光时间下的噪声分布,发现是读出噪声和散粒噪声的耦合问题。嗯,从那以后,我每次做降噪前都会先做噪声标定。
1.4 动态范围概念:相机能“看”多宽?
动态范围,说白了就是相机能同时记录的最亮和最暗区域的比值。单位是dB或者档位(stop)。
公式很简单:
DR = 20 * log10(满阱容量 / 读出噪声)
满阱容量就是传感器一个像素能装的最大电子数。读出噪声就是前面说的电路噪声。这个比值越大,动态范围越高。
我列个常见设备的动态范围对比,你感受一下:
| 设备类型 | 典型动态范围 | 说明 |
|---|---|---|
| 人眼 | 约 20 档(~120dB) | 自适应调节,瞬时范围约 14 档 |
| 手机传感器 | 10 - 12 档 | 受限于物理尺寸 |
| 单反相机 | 12 - 15 档 | 传感器更大,满阱容量更高 |
| 专业摄像机 | 14 - 16 档 | 双增益或三增益设计 |
注意: 手机传感器的动态范围通常只有10-12档。而真实场景的动态范围,比如逆光人像,可能超过20档。这就是为什么单帧永远拍不好——硬件限制摆在那里。HDR合成就是通过多帧不同曝光来“扩展”这个范围。
我个人习惯把动态范围理解为相机的“宽容度”。宽容度不够,亮部就过曝成一片白,暗部就欠曝成一片黑。HDR合成的核心思路,就是用短曝光保亮部,用长曝光保暗部,然后通过算法把它们完美拼起来。
1.5 本章知识结构总览
最后,我用一张图把本章的核心逻辑串起来。你记住这个框架,后面每一章都会围绕它展开。
这张图你看明白了吗?相机成像模型是基础。它引出了两个核心问题:噪声和动态范围。噪声模型告诉我们噪声长什么样,动态范围告诉我们硬件能记录多少信息。而多帧降噪和HDR合成,就是针对这两个问题的工程解决方案。
后面的课程,我会带你一步步深入每个环节。从噪声标定、多帧对齐、融合策略,到HDR的曝光选择、色调映射、鬼影消除。每一章都会有代码、有实验、有我在项目里踩过的坑。
嗯,今天就到这儿。记住这个框架,后面你会反复用到它。