第3章:噪声模型与分类——光子散粒噪声、读出噪声、固定模式噪声(FPN)、热噪声
做图像传感器ISP的,天天跟噪声打交道。说白了,噪声就是图像里那些不该出现的随机波动。你想想看,一个完美的传感器,在完全均匀的光照下,输出的像素值应该一模一样对吧?但现实中没有这种事。
我刚开始接触这行时,总觉得噪声就是“噪点”,后来踩了不少坑才明白——不同来源的噪声,特性完全不同,处理手段也天差地别。今天咱们就把四种最核心的噪声掰开揉碎了讲清楚。
4.1 光子散粒噪声(Photon Shot Noise)
这是最“物理”的一种噪声。光本身是由一个个光子组成的,光子到达传感器的过程服从泊松分布。什么意思呢?就是即使光源稳定,单位时间内到达像素的光子数也在随机波动。
这个波动的标准差等于光子数的平方根。假设平均有N个光子到达,那么实际值会在N ± √N之间跳动。信噪比就是N/√N = √N。所以——信号越强,信噪比越高。
我在项目中遇到过一个问题:暗光场景下,散粒噪声会非常明显。因为光子数少,√N相对于N的比例就大。比如N=100时,噪声占比10%;N=10000时,噪声占比只有1%。
散粒噪声有个特点——它是时域的,也是空域的。同一像素在不同帧之间会波动,同一帧的不同像素之间也会波动。而且它跟信号相关,信号越强噪声越大。
4.2 读出噪声(Read Noise)
读出噪声是传感器将电荷转换为电压、再转换为数字信号的过程中引入的。它跟信号大小无关,是一个固定底噪。你想想看,即使完全遮光(零信号),读出电路也会输出一个非零的随机值。
读出噪声的典型来源包括:
- 像素源跟随器噪声——晶体管的热噪声和1/f噪声
- 列放大器噪声——模拟增益级引入的噪声
- ADC量化噪声——模数转换时的量化误差
读出噪声的单位通常是电子数(e-)。现代CMOS传感器的读出噪声可以做到1-3 e-,而CCD可以做到更低,但速度慢。
| 噪声类型 | 与信号相关性 | 频率特性 | 校准方式 |
|---|---|---|---|
| 散粒噪声 | √N,正相关 | 白噪声 | 无法校准 |
| 读出噪声 | 与信号无关 | 白噪声+1/f | 暗帧校准 |
| FPN | 固定偏移/增益 | 空间低频 | 双采样/校准 |
| 热噪声 | 与温度相关 | 白噪声 | 制冷/校准 |
我曾经调试过一个项目,暗光下图像有严重的横条纹。查了半天,发现是列放大器电源纹波耦合进了读出噪声。后来在PCB布局上做了隔离,问题就解决了。嗯,硬件上的坑往往比算法上的更难找。
4.3 固定模式噪声(FPN)
FPN是传感器阵列中每个像素的固定偏移和增益差异造成的。说白了,就是每个像素的“个性”不一样。即使均匀光照,不同像素的输出值也不同。
FPN分为两种:
- 暗信号非均匀性(DSNU)——零光照下像素输出的差异
- 光响应非均匀性(PRNU)——相同光照下像素增益的差异
FPN的特点是空间固定——同一像素在不同帧之间的输出是稳定的,但不同像素之间差异明显。所以它可以通过校准来消除。
常用的FPN校准方法:
- 相关双采样(CDS)——读出时先采样复位电平,再采样信号电平,相减消除偏移
- 暗帧校准——拍摄一张全黑图像,作为偏移模板
- 平场校准——拍摄一张均匀光照图像,计算增益校正系数
4.4 热噪声(Thermal Noise / Dark Current Noise)
热噪声来自半导体中载流子的热运动。温度越高,载流子越活跃,产生的暗电流就越大。暗电流本身是随机的,服从泊松分布,所以它本质上也是一种散粒噪声——只是信号源是热激发电子,而不是光子。
热噪声跟曝光时间成正比。曝光时间越长,暗电流积累越多,噪声越明显。这也是为什么长曝光摄影需要制冷的原因。
我记得有一次做安防摄像头项目,客户反映夜间图像噪点严重。我们一开始以为是增益太高,后来发现是传感器温度升到了60°C。加了散热片后,温度降到40°C,暗电流噪声减少了大约一个数量级。
4.5 噪声模型总览
在实际的ISP硬件通路中,这些噪声是叠加在一起的。一个完整的噪声模型可以写成:
I_out = G * (I_signal + N_shot + N_dark + N_read) + N_FPN_offset + N_FPN_gain * I_signal
其中:
- G 是系统增益
- N_shot 是散粒噪声(信号相关)
- N_dark 是暗电流噪声(温度相关)
- N_read 是读出噪声(固定底噪)
- N_FPN_offset 是DSNU
- N_FPN_gain 是PRNU
下面这张图展示了噪声在传感器读出通路中的分布:
4.6 硬件通路中的噪声处理策略
了解了噪声模型,咱们才能对症下药。在ISP硬件通路中,不同噪声的处理时机和方式不同:
- FPN校准——放在最前面,通常在RAW域做。用暗帧和平场帧生成校准系数,逐像素修正。
- 散粒噪声和读出噪声——放在去噪模块处理。散粒噪声用空间域滤波,读出噪声可以用时域滤波。
- 热噪声——如果温度可控,优先通过散热解决。算法上可以用长曝光暗帧校准。