2. 噪声来源分析:传感器噪声、量化噪声与光子噪声
做 HDR 色调映射,说白了就是在跟噪声打架。你想想看,多帧合成也好,单帧恢复也罢,最终图像里那些不该出现的颗粒、色斑、闪烁,源头到底在哪?
我个人习惯把噪声来源分成三大类:传感器噪声、量化噪声、光子噪声。这三兄弟性质完全不同,处理手段也天差地别。咱们一个一个来拆。
2.1 光子噪声:物理极限,躲不掉
光子噪声,也叫散粒噪声。它根植于光的量子本质——光子到达传感器像素的速率不是均匀的,而是服从泊松分布。
什么意思?就是同一光照下,同一像素,两次曝光接收到的光子数会有波动。这个波动的标准差等于光子数的平方根。
核心公式:
光子噪声标准差 σshot = √(Nphotons)
信噪比 SNR = Nphotons / √(Nphotons) = √(Nphotons)
我在项目中遇到过最典型的场景:暗光下拍夜景,ISO 已经拉到很高了,画面里那种细密的、像沙子一样的颗粒,大部分就是光子噪声。你没法消除它——因为它是物理过程固有的。唯一能做的,就是增加光子数(延长曝光、开大光圈、多帧平均)。
实战经验:
HDR 合成时,暗帧的光子噪声会被色调映射曲线放大。我曾经在一条 3.0 的伽马曲线上,暗部噪声被抬高了将近 8 倍。所以做 tone mapping 之前,先对暗帧做一次空间域降噪,效果会好很多。
2.2 传感器噪声:电路里的“脏东西”
传感器噪声来自读出电路和像素本身。它不像光子噪声那样“公平”——不同像素、不同温度、不同增益下,表现差异很大。
我习惯把它再拆成两类:
- 读出噪声:像素电荷转换成电压、再被 ADC 量化过程中引入的噪声。跟曝光时间无关,跟读出速度有关。高速读出时噪声更大。
- 暗电流噪声:即使完全遮光,像素也会因为热激发产生电子。温度每升高 6-8°C,暗电流翻倍。长曝光时尤其明显。
| 噪声类型 | 与曝光关系 | 与温度关系 | 与增益关系 |
|---|---|---|---|
| 读出噪声 | 无关 | 弱相关 | 随增益放大 |
| 暗电流噪声 | 线性增加 | 强相关(每 6-8°C 翻倍) | 随增益放大 |
| 光子噪声 | 平方根关系 | 无关 | 随增益放大 |
避坑指南:
我曾经调试过一款手机传感器,长曝光模式下暗部出现固定条纹。查了半天,发现是读出电路在低电压下产生了行噪声。这种噪声在 HDR 合成时会被多帧平均算法“抹平”一部分,但如果帧间对齐不准,反而会变成闪烁伪影。嗯,后来我加了一行行相关的校正,才搞定。
2.3 量化噪声:ADC 的“舍入误差”
量化噪声是模数转换过程中产生的。模拟信号是连续的,数字信号是离散的——这个“取整”的过程,就是量化噪声的来源。
它的特点是:均匀分布、与信号无关、幅度固定。一个 12-bit ADC 的量化步长是 1/4096,量化噪声的标准差大约是 1/√12 个 LSB。
你可能会问:量化噪声这么小,重要吗?
重要。尤其是在 HDR 场景下。想想看:
- 暗部信号本身就很弱,量化噪声可能跟信号差不多大
- 色调映射会拉伸暗部,量化噪声被放大后变得肉眼可见
- 多帧合成时,如果帧间量化误差不相关,平均后噪声会降低;但如果相关(比如固定模式),反而会累积
一个具体数字:
12-bit ADC,量化噪声标准差 ≈ 0.29 LSB。如果信号只有 10 LSB,信噪比只有 10/0.29 ≈ 34.5,约 30.7 dB。再经过 4 倍色调映射拉伸,信噪比掉到 18.7 dB——已经能看到明显颗粒了。
2.4 三种噪声的叠加关系
实际图像里,这三种噪声是同时存在的。它们互相独立,所以总噪声是方差相加:
σ2total = σ2shot + σ2readout + σ2dark + σ2quant
不同亮度区域,主导噪声不同:
- 暗部:读出噪声 + 暗电流噪声占主导
- 中间调:光子噪声开始显现
- 亮部:光子噪声占主导,量化噪声几乎可以忽略
下面这张图能帮你直观理解这个关系:
2.5 噪声对 HDR 色调映射的具体影响
搞清楚了噪声来源,咱们得聊聊它怎么影响 tone mapping 的结果。我总结了三个关键点:
- 暗部噪声放大:色调映射曲线通常是非线性的,暗部斜率大。这意味着暗部的噪声会被乘以一个大于 1 的系数。举个例子,如果曲线在暗部的增益是 4x,那么原本 2 LSB 的噪声就变成了 8 LSB——肉眼可见。
- 细节与噪声的混淆:在低信噪比区域,真正的纹理细节和噪声在频域上很难区分。降噪太强会糊掉细节,降噪太弱噪声又会被映射放大。这个平衡点,是 HDR 算法最核心的难点。
- 帧间噪声不一致:多帧 HDR 合成时,不同曝光帧的噪声特性不同。短帧光子噪声小但读出噪声相对明显,长帧光子噪声大但读出噪声被信号淹没。直接平均会导致噪声特性突变,产生“噪声斑块”。
我的处理习惯:
在做 tone mapping 之前,我会先对每个曝光帧做一次自适应降噪——暗部用双边滤波,亮部用高斯滤波。然后根据每帧的信噪比估计值,在合成时做加权融合。这样能最大程度保留细节,同时抑制噪声放大。
2.6 噪声测量与建模
要处理噪声,先得测量它。我常用的方法是拍一张均匀灰卡,然后分析像素值的统计分布:
| 步骤 | 操作 | 得到什么 |
|---|---|---|
| 1 | 全黑拍摄(镜头盖盖住) | 暗电流 + 读出噪声 |
| 2 | 不同亮度灰卡拍摄 | 光子噪声随信号的变化曲线 |
| 3 | 计算像素值方差 vs 均值 | 噪声模型参数(增益、读出噪声方差) |
| 4 | 分析残差图像 | 固定模式噪声、行噪声等 |
有了噪声模型,你就可以在算法里做“噪声感知”的色调映射了。比如,在暗部降低对比度增强的强度,或者根据局部信噪比动态调整降噪参数。
曾经踩过的坑:
我早期做 HDR 算法时,直接拿厂家给的噪声参数来用。结果发现实际传感器在不同温度下噪声差异很大——夏天室外 40°C 和室内 25°C,暗电流能差 4 倍。后来我加了一个温度传感器读数作为输入,实时更新噪声模型,才稳定下来。