3. 噪声模型与仿真:高斯噪声、泊松噪声、异方差噪声的数学建模

做降噪算法,第一件事不是调模型,而是搞清楚——你面对的噪声到底是什么?

我见过不少团队,上来就用高斯噪声训练网络,结果到了真实 sensor 上一测,效果直接崩掉。为什么?因为真实世界的噪声,远比教科书复杂。

这一章,我们就来拆解三种最核心的噪声模型:高斯、泊松、异方差。我会把数学公式讲清楚,也会告诉你,这些模型在工程落地时该怎么用、有什么坑。

3.1 高斯噪声:最基础的假设,也是最常见的陷阱

高斯噪声,也叫正态噪声。它的概率密度函数长这样:

p(x) = (1 / (σ * √(2π))) * exp(-(x - μ)² / (2σ²))

其中 μ 是均值,σ 是标准差。在图像里,我们通常假设 μ=0,噪声是零均值的。

核心特点:每个像素的噪声独立同分布,方差恒定。

我在项目中遇到过一件事:用高斯噪声训练的模型,在暗光场景下完全失效。为什么?因为暗光下噪声方差会随信号强度变化,高斯模型根本描述不了这个特性。

工程建议:

  • 高斯噪声适合模拟 sensor 的读出噪声(read noise)
  • 在亮光场景下,高斯近似勉强可用
  • 暗光场景下,千万别只用高斯噪声

我的习惯:做仿真时,我会把高斯噪声作为 baseline,但从来不会只依赖它。你想想看,如果真实 sensor 的噪声那么简单,我们就不用花几十页讲降噪了。

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

泊松噪声来自光子到达 sensor 的随机性。物理上,光子到达数量服从泊松分布:

P(k) = (λ^k * e^(-λ)) / k!

其中 λ 是平均光子数,k 是实际到达的光子数。

在图像里,泊松噪声有个重要特性:方差等于均值。也就是说,信号越强,噪声越大。

特性 高斯噪声 泊松噪声
方差与信号关系 独立 方差 = 均值
适用场景 读出噪声、热噪声 光子散粒噪声
暗光表现 不准确 更真实

我曾经在一个夜景降噪项目里,直接用高斯噪声训练,结果模型把暗部细节全抹平了。后来换成泊松噪声仿真,效果立刻提升了一个档次。

注意:泊松噪声在低光下会呈现明显的“颗粒感”,这是物理规律,不是 sensor 缺陷。你的模型必须学会处理这种非高斯特性。

3.3 异方差噪声:真实世界的噪声模型

真实 sensor 的噪声,既不是纯高斯,也不是纯泊松。它是两者的混合体,而且方差随信号强度变化——这就是异方差噪声。

一个经典的模型是:

σ_total² = σ_read² + k * I

其中 σ_read² 是读出噪声(高斯部分),k * I 是散粒噪声(泊松部分),I 是信号强度。

说白了,暗区噪声主要来自读出噪声,亮区噪声主要来自散粒噪声。这个模型,我几乎在每个量产项目里都用过。

3.4 噪声仿真工程实现

理论讲完了,咱们直接上代码。下面是一个完整的噪声仿真函数,我把它封装成了可以直接用的工具。

import numpy as np

def add_noise(image, read_noise_std=2.0, shot_noise_coeff=0.1):
    """
    异方差噪声仿真
    image: 输入图像,范围 [0, 255]
    read_noise_std: 读出噪声标准差
    shot_noise_coeff: 散粒噪声系数
    """
    # 归一化到 [0, 1]
    img = image.astype(np.float32) / 255.0
    
    # 读出噪声(高斯)
    read_noise = np.random.normal(0, read_noise_std/255.0, img.shape)
    
    # 散粒噪声(泊松近似)
    shot_noise = np.random.normal(0, np.sqrt(shot_noise_coeff * img), img.shape)
    
    # 总噪声
    noisy = img + read_noise + shot_noise
    
    # 裁剪到合法范围
    noisy = np.clip(noisy, 0, 1)
    
    return (noisy * 255).astype(np.uint8)

避坑指南:我曾经直接用泊松分布采样,结果发现速度太慢。后来改用高斯近似泊松(当 λ > 20 时),速度快了 10 倍,精度损失可以忽略。

3.5 噪声模型选择策略

不同场景下,我推荐不同的噪声模型组合:

  • 亮光场景(ISO < 400):高斯噪声就够了,简单高效
  • 中等光照(ISO 400-1600):高斯 + 泊松混合,注意调整比例
  • 暗光场景(ISO > 1600):必须用异方差模型,还要考虑固定模式噪声

你可能会问:为什么不直接用真实 sensor 数据?当然可以,但仿真噪声的好处是——你可以精确控制噪声的统计特性,方便 ablation study 和模型调试。

3.6 本章知识结构

下面这张图,把三种噪声模型的关系和工程落地路径画清楚了。

噪声模型与仿真知识结构 高斯噪声 泊松噪声 异方差噪声 方差恒定 适合读出噪声 亮光场景 方差 = 均值 适合散粒噪声 中等光照 方差随信号变化 混合模型 暗光场景 工程落地:噪声仿真 → 训练数据生成 降噪模型训练 & 部署 关键:噪声参数 需与 sensor 标定对齐 建议:多模型组合 覆盖全光照范围

嗯,这张图把核心逻辑都串起来了。从三种噪声模型出发,到工程落地的仿真实现,再到最终的模型训练和部署。每一步都有对应的数学基础和工程技巧。

我个人习惯,在做新项目时,会先花一周时间标定 sensor 的噪声参数,然后建立准确的仿真 pipeline。这一步做好了,后面的降噪模型训练会事半功倍。