3. 图像噪声模型:从数学到实战
图像噪声,说白了就是传感器在采集信号时混入的「杂质」。我做了这么多年图像质量评测,跟噪声打交道的时间比跟家人还多。每次看到一张干净的照片,我都会下意识想——这背后肯定做了不少降噪处理。
今天咱们就来聊聊四种最常见的噪声模型。我会把数学模型、生成代码、还有我踩过的坑一并告诉你。
3.1 高斯噪声:最基础的噪声模型
高斯噪声是图像处理里最常见的噪声。它服从正态分布,每个像素点的噪声值独立且同分布。
数学模型:
I_noisy = I_original + n
n ~ N(0, σ²)
其中 σ 是标准差,控制噪声强度。σ 越大,图像越花。
Python 生成代码:
import cv2
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)
# 使用示例
img = cv2.imread('test.jpg', 0)
noisy_img = add_gaussian_noise(img, sigma=30)
我的经验:实际项目中,σ 取 15-30 比较接近真实传感器噪声。我曾经在安防摄像头项目里,发现 σ=25 的模拟噪声跟真实夜间拍摄的噪声几乎一样。
3.2 椒盐噪声:黑白点的艺术
椒盐噪声就是图像上随机出现的白点(盐)和黑点(椒)。它模拟的是像素值被完全破坏的情况。
数学模型:
P(像素被破坏) = p
被破坏后:
- 变成 255(盐)的概率 = p/2
- 变成 0(椒)的概率 = p/2
- 保持原值的概率 = 1-p
Python 生成代码:
def add_salt_pepper_noise(image, prob=0.02):
noisy = image.copy()
total = image.size
# 椒噪声
num_pepper = int(total * prob / 2)
coords = [np.random.randint(0, i-1, num_pepper) for i in image.shape]
noisy[coords[0], coords[1]] = 0
# 盐噪声
num_salt = int(total * prob / 2)
coords = [np.random.randint(0, i-1, num_salt) for i in image.shape]
noisy[coords[0], coords[1]] = 255
return noisy
注意:prob 参数别设太大。我见过有人设 0.5,结果图像完全被黑白点覆盖,根本看不出原图。实际场景中,prob 在 0.01-0.05 之间比较合理。
3.3 泊松噪声:跟光强有关的噪声
泊松噪声跟光子计数有关。光线越暗,噪声越明显。这在低光照场景下特别常见。
数学模型:
I_noisy = Poisson(I_original)
其中 Poisson(λ) 的均值和方差都是 λ
说白了,每个像素点的值不再是一个确定数,而是服从泊松分布的随机变量。像素值越大,噪声方差也越大。
Python 生成代码:
def add_poisson_noise(image):
# 将像素值缩放到合适范围
scale = 255 / image.max()
scaled = image * scale
noisy = np.random.poisson(scaled)
return (noisy / scale).astype(np.uint8)
关键点:泊松噪声的方差等于均值。这意味着暗部区域噪声小,亮部区域噪声大。这跟高斯噪声完全不同——高斯噪声的方差是固定的。
3.4 乘性噪声:跟信号成比例的噪声
乘性噪声也叫斑点噪声,常见于雷达图像和超声图像。它的特点是:信号越强,噪声越强。
数学模型:
I_noisy = I_original × (1 + n)
n ~ N(0, σ²)
注意这里是乘法,不是加法。所以暗部区域受影响小,亮部区域受影响大。
Python 生成代码:
def add_multiplicative_noise(image, sigma=0.1):
noise = np.random.normal(1, sigma, image.shape)
noisy = image * noise
return np.clip(noisy, 0, 255).astype(np.uint8)
避坑指南:我曾经在超声图像处理项目里,直接用高斯噪声模拟,结果效果很差。后来换成乘性噪声,才跟真实数据对得上。所以选噪声模型时,一定要考虑实际物理过程。
3.5 四种噪声对比总结
| 噪声类型 | 数学模型 | 特点 | 常见场景 |
|---|---|---|---|
| 高斯噪声 | 加法,固定方差 | 均匀分布在整个图像 | 传感器热噪声 |
| 椒盐噪声 | 随机破坏像素 | 黑白点,稀疏分布 | 传输错误 |
| 泊松噪声 | 泊松分布 | 方差随信号变化 | 低光照拍摄 |
| 乘性噪声 | 乘法,比例噪声 | 信号越强噪声越大 | 雷达/超声图像 |
3.6 知识体系结构图
下面这张图帮你理清四种噪声的关系和区别:
3.7 实战建议
嗯,最后说几点我这些年总结的经验:
- 不要混用噪声模型:实际场景中通常只有一种主导噪声。我见过有人把四种噪声全加上,结果图像面目全非,完全没法用。
- 参数要合理:模拟噪声的目的是测试算法鲁棒性,不是把图像毁掉。参数设置要贴近真实场景。
- 先观察再动手:拿到一张有噪声的图像,先看看噪声的分布规律。是均匀分布还是跟信号相关?这决定了你该用哪种模型。
核心思想:噪声模型是工具,不是目的。理解每种噪声的物理含义,比记住公式更重要。我刚开始做图像处理时,死记硬背公式,结果遇到实际问题还是不会选。后来慢慢积累经验,才明白「为什么」比「是什么」更重要。