3. 噪声模型与分类:高斯噪声、泊松噪声、散粒噪声、读出噪声、固定模式噪声

做图像降噪这么多年,我最大的感受就是:不懂噪声,就别谈降噪。你想想看,连对手是谁都没搞清楚,怎么打?

很多同学一上来就调滤波器参数,效果不好就换算法,折腾半天还是糊的。其实问题出在根上——你根本不知道手里的噪声长什么样。

这一章,我们就来把噪声的底细摸清楚。我会结合自己踩过的坑,把五种最常见的噪声模型掰开揉碎了讲。

核心观点:噪声不是随机的“坏东西”,它有规律、有模型、有参数。掌握了噪声模型,你就能针对性地设计降噪策略,而不是瞎猫碰死耗子。

图像噪声分类体系 图像噪声 信号相关噪声 泊松噪声(光子散粒噪声) 散粒噪声(Shot Noise) 信号无关噪声 高斯噪声(Gaussian Noise) 读出噪声(Readout Noise) 空间模式噪声 固定模式噪声(FPN) 💡 噪声分类的关键维度 • 信号相关 vs 信号无关:决定噪声强度是否随信号变化 • 时间维度 vs 空间维度:区分时变噪声与固定模式 • 统计分布特性:高斯、泊松、均匀等决定了数学建模方式 • 实际传感器中,多种噪声叠加出现,需要联合建模

3.1 高斯噪声——最基础的噪声模型

高斯噪声,说白了就是每个像素上叠加一个服从正态分布的随机值。它独立于信号强度,亮的地方和暗的地方噪声幅度差不多。

数学上很简单:

I_noisy(x,y) = I_clean(x,y) + n(x,y)
n(x,y) ~ N(0, σ²)

其中 σ 是标准差,控制噪声强度。σ 越大,图像越花。

我的经验:高斯噪声是降噪算法的“Hello World”。几乎所有算法——BM3D、NLM、DnCNN——第一个测试集都是高斯噪声。如果你连高斯噪声都搞不定,后面的就别想了。

实际场景中,高斯噪声主要来自:

  • 传感器热噪声:温度越高,σ 越大。我记得有一次在户外40度高温下测试相机,噪声水平直接翻倍。
  • 放大器噪声:模拟电路放大信号时引入的随机波动。
  • 量化噪声:ADC 转换时的舍入误差,近似为均匀分布,但在低光照下会表现出高斯特性。

3.2 泊松噪声——光子计数的本质

这个就有点意思了。泊松噪声的根源是光子的量子特性。

你想想看,光线打到传感器上,本质上是光子一个个砸过来。单位时间内砸到像素上的光子数,服从泊松分布。这意味着:

  • 噪声方差 = 信号均值。信号越强,噪声越大。
  • 信噪比 SNR = √(信号均值)。信号翻4倍,SNR才翻2倍。

数学形式:

I_noisy ~ Poisson(I_clean)
E[I_noisy] = I_clean
Var[I_noisy] = I_clean

⚠️ 常见误区:很多人以为泊松噪声是加性的。错!它是信号依赖的。你用高斯噪声的模型去处理泊松噪声,暗部会过平滑,亮部又去不干净。

我曾经在一个低光照监控项目里吃过这个亏。当时直接用高斯降噪,结果暗部细节全没了,亮部还有残留噪声。后来换成泊松-高斯混合模型,效果立竿见影。

3.3 散粒噪声——泊松噪声的“亲戚”

散粒噪声,英文叫 Shot Noise。其实它和泊松噪声是同一个物理现象的两个名字。

严格来说:

  • 光子散粒噪声:光子到达的随机性,就是上面说的泊松噪声。
  • 暗电流散粒噪声:即使没有光照,传感器内部热激发也会产生电子,这些电子也服从泊松分布。

所以你可以把散粒噪声理解为泊松噪声在传感器领域的特称。

噪声类型 物理来源 分布 信号相关性
光子散粒噪声 光子到达随机性 泊松 √信号
暗电流散粒噪声 热激发电子 泊松 √(与温度相关)
读出噪声 电路读取过程 近似高斯 ✗ 信号无关
固定模式噪声 像素工艺差异 固定偏移 ✗ 空间相关

3.4 读出噪声——电路层面的“杂质”

读出噪声,是传感器把电荷转换成电压、再转换成数字信号的过程中引入的。

我个人习惯把它分成三段:

  1. 复位噪声:像素复位时,电容上的电压随机波动。
  2. 源跟随器噪声:放大晶体管的热噪声和1/f噪声。
  3. ADC量化噪声:模数转换的舍入误差。

读出噪声的特点是:

  • 与信号无关,暗场下也能测到。
  • 近似高斯分布,但可能有轻微的非高斯尾巴。
  • 与帧率相关,帧率越高,读出噪声越大。

避坑指南:我曾经在调试一款高速相机时,发现暗场噪声特别大。查了半天,原来是读出时钟频率设得太高,导致ADC采样不稳定。降了一档频率,噪声直接降了40%。

3.5 固定模式噪声——每个像素的“指纹”

固定模式噪声(FPN),是传感器制造工艺不一致导致的。每个像素对光的响应有细微差异,表现为:

  • 暗信号非均匀性(DSNU):无光照时,各像素输出不同。
  • 光响应非均匀性(PRNU):相同光照下,各像素增益不同。

FPN 的特点是空间固定、时间不变。同一颗传感器,拍100张暗场,FPN 的图案几乎一模一样。

怎么处理?

// 暗场校正:减去暗帧均值
def correct_fpn(image, dark_frame):
    return image - dark_frame

// 增益校正:用均匀光照场计算增益矩阵
def correct_prnu(image, gain_map):
    return image / gain_map

⚠️ 注意:FPN 会随温度和时间漂移。你一个月前做的暗场校正,今天可能就不准了。工业相机通常会在开机时自动采集暗帧。

3.6 实战中的噪声模型选择

说了这么多,你可能会问:实际项目中到底用哪个模型?

我的建议是:

场景 推荐模型 理由
手机拍照(白天) 高斯 + 泊松混合 光子噪声为主,读出噪声为辅
手机拍照(夜景) 泊松主导 + 高斯 信号弱,泊松噪声占主导
工业检测(高ISO) 高斯 + FPN 读出噪声和固定模式噪声突出
科学相机(低温) 泊松 + 读出噪声 暗电流被抑制,光子噪声为主
监控摄像头 高斯 + 泊松 + FPN 环境复杂,三种噪声共存

嗯,这里要注意:没有万能的噪声模型。我一般会先拍一组暗场和亮场,用统计方法估计噪声参数,再决定用哪个模型。

一句话总结:高斯噪声是基础,泊松噪声是本质,散粒噪声是泊松的别名,读出噪声是电路产物,FPN 是工艺缺陷。搞懂它们,你的降噪算法就有了“眼睛”。