3. 传感器噪声模型:光子散粒噪声、读出噪声、固定模式噪声的数学建模

做HDR图像处理,绕不开一个核心问题——噪声从哪来?

我个人习惯把传感器噪声分成三类:光子散粒噪声、读出噪声、固定模式噪声。这三兄弟性格完全不同,建模方式也各有门道。今天咱们就把它们一个个拆开,看看数学上怎么描述,实际项目中又该怎么处理。

3.1 光子散粒噪声:物理本质决定的随机性

先说最根本的——光子散粒噪声。这玩意儿是量子效应的直接体现,躲不掉的。

光打到传感器上,本质是离散的光子事件。单位时间内到达的光子数服从泊松分布。你想想看,就算场景亮度完全恒定,每个像素收集到的光子数也会有波动。

核心公式:

光子散粒噪声方差 = 平均光子数 (μ)

标准差 = √μ

为什么是泊松分布?因为光子到达是独立随机事件,且单位时间内的平均到达率是常数。泊松分布有个重要性质:均值等于方差。这意味着信号越强(光子数越多),噪声的值越大,但信噪比反而提高。

我在项目中遇到过一个问题:低光照场景下,散粒噪声的信噪比极低。比如平均只有10个光子时,标准差就是√10 ≈ 3.16,信噪比只有10/3.16 ≈ 3.16。这直接导致暗部区域出现明显的颗粒感。

平均光子数 (μ) 标准差 (√μ) 信噪比 (μ/√μ)
10 3.16 3.16
100 10 10
1000 31.62 31.62
10000 100 100

从表格能看出来,光子数越多,信噪比越高。这就是为什么HDR合成时,长曝光帧的暗部细节其实比短曝光帧更干净——虽然长曝光可能引入其他问题。

实战经验:处理散粒噪声时,我建议用方差稳定变换(如Anscombe变换)把泊松噪声近似为高斯噪声,这样后续的滤波算法会更顺手。

3.2 读出噪声:电路层面的“底噪”

读出噪声是传感器读出电路引入的,跟光子没关系。它存在于每个像素的读出过程中,包括复位噪声、放大器噪声、量化噪声等。

说白了,就算你把镜头盖盖上(零光照),读出电路也会产生一个本底噪声。这个噪声通常建模为零均值高斯分布。

数学模型:

读出噪声 ~ N(0, σ_read²)

其中 σ_read 是读出噪声的标准差,单位通常用电子数 (e⁻) 表示。

读出噪声有几个特点:

  • 与信号无关:不管光照强弱,读出噪声的方差基本恒定
  • 与增益相关:增益越高,读出噪声被放大的倍数越大
  • 与温度相关:温度升高,读出噪声通常也会增大

我曾经踩过一个坑:某次做HDR多帧合成,发现暗帧的噪声水平比理论值高很多。排查了半天,发现是传感器温度升高导致读出噪声从2e⁻涨到了4e⁻。嗯,这里要注意——高帧率拍摄时传感器发热不可忽视。

避坑指南:我曾经在低光照HDR场景中,把读出噪声模型设成了常数。结果合成后的图像暗部出现条带状噪声。后来才发现,不同列像素的读出电路有微小差异,导致读出噪声在列方向上存在相关性。建议用列相关噪声模型替代纯独立同分布假设。

3.3 固定模式噪声:像素间的“个性差异”

固定模式噪声(FPN)是传感器制造工艺导致的。每个像素的光电响应特性不完全一致,有的像素偏亮,有的偏暗。这种差异在空间上是固定的,不随时间变化。

FPN通常分为两类:

类型 来源 特性 校正方法
暗信号非均匀性 (DSNU) 暗电流差异 零光照下的偏移 暗帧减除
光响应非均匀性 (PRNU) 量子效率差异 增益随光照变化 平场校正

FPN数学模型:

DSNU: 每个像素 i 的暗偏移量 O_i ~ N(0, σ_DSNU²)
PRNU: 每个像素 i 的增益系数 G_i ~ N(1, σ_PRNU²)

最终像素值 = G_i × (光子信号 + 散粒噪声) + O_i + 读出噪声

你想想看,如果FPN不校正,HDR合成时不同曝光帧的像素偏移会叠加,产生严重的固定图案。我见过一个案例:某款手机传感器PRNU达到2%,在长曝光帧中直接导致画面出现网格状纹理。

3.4 三种噪声的协同建模

实际传感器中,这三种噪声是同时存在的。完整的噪声模型需要把它们组合起来。

完整噪声模型:

观测值 = G_i × (μ + √μ × ε_shot) + O_i + ε_read

其中:
- μ: 理想光子数
- ε_shot ~ N(0,1): 散粒噪声归一化项
- ε_read ~ N(0, σ_read²): 读出噪声
- G_i ~ N(1, σ_PRNU²): PRNU增益
- O_i ~ N(0, σ_DSNU²): DSNU偏移

这个模型看起来复杂,但实际应用时可以简化。比如在HDR多帧合成中,我通常把FPN先通过暗帧和平场校正消除,剩下的就是散粒噪声和读出噪声的混合体。

下面这张图展示了三种噪声在传感器信号链中的位置和关系:

传感器噪声模型框架 光子入射 散粒噪声 (泊松) PRNU (乘性) 读出电路 DSNU (加性偏移) 读出噪声 (高斯) ADC量化 量化噪声 数字像素值 (含噪声) 噪声叠加顺序 1. 散粒噪声 (泊松) 2. PRNU (乘性增益) 3. DSNU (加性偏移) 4. 读出噪声 (高斯) 关键参数 σ_read: 读出噪声 σ_PRNU: 增益非均匀性 σ_DSNU: 偏移非均匀性

3.5 噪声参数标定:从理论到实践

理论模型有了,怎么拿到实际参数?我分享一个常用的标定流程:

  1. 暗帧采集:盖上镜头盖,拍摄多帧全黑图像。计算每像素的均值和方差,得到DSNU和读出噪声的估计。
  2. 平场采集:拍摄均匀光照下的灰卡,多帧平均后计算像素间的增益差异,得到PRNU估计。
  3. 光子转移曲线:改变光照强度,记录均值和方差的关系。斜率就是增益系数,截距就是读出噪声方差。

实用技巧:标定FPN时,我建议至少采集100帧暗帧和100帧平场帧。帧数太少,随机噪声会污染FPN的估计结果。另外,标定环境温度要和实际使用场景一致,否则参数会漂移。

有了准确的噪声模型,后续的HDR合成和色调映射才能做到“对症下药”。比如在合成阶段,可以根据每个像素的噪声水平自适应调整权重,让信噪比高的像素贡献更多信息。

嗯,噪声模型这块就聊到这儿。记住一句话:噪声不是敌人,而是系统的一部分。理解它、建模它、利用它,才是HDR图像处理的正确姿势。