图像噪声基础:噪声来源与噪声模型
做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中的噪声模型选择
真实场景下,噪声是混合的。我常用的策略是:
- 亮部区域:泊松噪声为主,用方差稳定变换处理
- 暗部区域:读出噪声占主导,用高斯模型处理
- 极端情况:加上椒盐模型处理坏点
| 场景 | 主要噪声类型 | 推荐处理方式 |
|---|---|---|
| 白天户外 | 光子噪声(泊松) | 轻量降噪,保留细节 |
| 室内灯光 | 光子噪声 + 读出噪声 | 中等强度降噪 |
| 暗光/夜景 | 读出噪声为主 | 强降噪 + 边缘保护 |
| 长曝光 | 暗电流 + 读出噪声 | 先做暗电流校正 |
我的调参习惯:先拍一张灰阶卡,分析不同亮度下的噪声方差曲线。如果曲线是线性的,高斯模型够用;如果是抛物线,必须上泊松模型。这个测试花不了10分钟,但能省你后面几天的调参时间。