图像噪声基础:噪声来源与噪声模型

做ISP算法,说白了就是跟噪声打交道。你想想看,传感器出来的原始数据,哪有一张是干净的?我刚开始接触这行时,总觉得降噪就是简单做个模糊,结果细节全没了,被老大骂了一顿。后来才明白——不懂噪声,就别谈降噪。

这一章,咱们就把噪声的底细摸清楚。从哪来、长啥样、怎么建模,一个一个说。

2.1 噪声从哪来?三大元凶

图像传感器里的噪声,主要来自三个地方。我习惯把它们叫做「三大元凶」:

噪声类型 物理来源 特性 我碰到的坑
光子噪声 光子到达的随机性 与信号强度成正比 暗光下反而更明显
读出噪声 电路读取过程引入 与信号无关,固定底噪 高ISO时被放大
暗电流 热激发产生的电子 与温度、曝光时间相关 长曝光时一片红

2.1.1 光子噪声(散粒噪声)

光本身就是离散的光子。到达每个像素的光子数量,服从泊松分布。这不是传感器的问题,是物理定律决定的。

我在项目中遇到过一台手机摄像头,白天成像还行,一到黄昏就满屏颗粒。一开始以为是传感器太差,后来一算——就是光子噪声。信号弱了,信噪比自然就低。

关键公式:光子噪声的标准差 = √(信号强度)。信号越强,噪声值越大,但信噪比反而越高。

2.1.2 读出噪声

这个就好理解了。传感器把电荷转成电压、再转成数字信号,每一步电路都会引入噪声。读出噪声是加性噪声,跟信号大小没关系。

嗯,这里要注意:读出噪声在暗部特别扎眼。因为暗部信号本来就小,读出噪声一叠加,信噪比直接崩了。

我的经验:调ISP参数时,先测一下读出噪声的底噪水平。方法很简单——盖上镜头盖拍一张全黑图,看标准差。这个值决定了你的降噪强度下限。

2.1.3 暗电流

温度每升高6-8°C,暗电流翻一倍。我做过一个安防摄像头项目,夏天户外60°C,长曝光30秒,出来的图跟火烧云似的——全是暗电流噪声。

暗电流的分布也不是均匀的。有些像素天生漏电大,就成了坏点。所以暗电流校正(DCNU)是ISP里必不可少的一步。

2.2 噪声模型:给噪声「画像」

知道了噪声来源,还得能用数学描述它。这样算法才能对症下药。常用的噪声模型有三种:

噪声模型分类与适用场景 图像噪声模型 高斯噪声 泊松噪声 椒盐噪声 高斯噪声特性 • 加性、与信号无关 • 概率密度呈钟形曲线 • 模拟读出噪声、热噪声 泊松噪声特性 • 信号相关噪声 • 均值=方差 • 模拟光子噪声 椒盐噪声特性 • 随机黑白像素点 • 脉冲型、非连续 • 模拟坏点、传输错误

2.2.1 高斯噪声模型

高斯噪声是最常用的简化模型。为什么?因为中心极限定理告诉我们,很多独立随机因素叠加起来,就趋近高斯分布。

数学上很简单:

# 高斯噪声生成(Python)
import numpy as np

def add_gaussian_noise(image, mean=0, sigma=25):
    noise = np.random.normal(mean, sigma, image.shape)
    noisy = image + noise
    return np.clip(noisy, 0, 255).astype(np.uint8)

我一般用sigma=25来模拟中等噪声水平。但注意——真实传感器噪声很少是纯高斯的。这只是个近似。

2.2.2 泊松噪声模型

泊松噪声才是光子噪声的「真身」。它的特点是:噪声方差等于信号强度。

亮的地方噪声大,但信号也大,信噪比反而高。暗的地方噪声小,但信号更小,信噪比就惨了。

# 泊松噪声模拟
def add_poisson_noise(image):
    # 假设图像值代表光子计数
    noisy = np.random.poisson(image)
    return np.clip(noisy, 0, 255).astype(np.uint8)

我曾经踩过的坑:直接用高斯模型去处理暗光图像,结果暗部要么过平滑丢失细节,要么残留大量噪声。后来改用泊松-高斯混合模型,效果才上去。记住——暗光场景,泊松成分占主导。

2.2.3 椒盐噪声模型

椒盐噪声就是随机出现的纯白或纯黑像素。传感器坏点、传输误码都会产生这种噪声。

处理椒盐噪声,中值滤波是经典方案。但要注意——别把边缘也滤没了。

# 椒盐噪声生成
def add_salt_pepper_noise(image, prob=0.02):
    output = image.copy()
    # 椒噪声(黑点)
    mask_pepper = np.random.random(image.shape) < prob/2
    output[mask_pepper] = 0
    # 盐噪声(白点)
    mask_salt = np.random.random(image.shape) < prob/2
    output[mask_salt] = 255
    return output

2.3 实际ISP中的噪声模型选择

真实场景下,噪声是混合的。我常用的策略是:

  1. 亮部区域:泊松噪声为主,用方差稳定变换处理
  2. 暗部区域:读出噪声占主导,用高斯模型处理
  3. 极端情况:加上椒盐模型处理坏点
场景 主要噪声类型 推荐处理方式
白天户外 光子噪声(泊松) 轻量降噪,保留细节
室内灯光 光子噪声 + 读出噪声 中等强度降噪
暗光/夜景 读出噪声为主 强降噪 + 边缘保护
长曝光 暗电流 + 读出噪声 先做暗电流校正

我的调参习惯:先拍一张灰阶卡,分析不同亮度下的噪声方差曲线。如果曲线是线性的,高斯模型够用;如果是抛物线,必须上泊松模型。这个测试花不了10分钟,但能省你后面几天的调参时间。