3. 传感器噪声模型:光子散粒噪声、读出噪声、固定模式噪声(FPN)、暗电流
聊RAW域降噪,绕不开传感器噪声模型。说白了,你得先知道噪声从哪来、长什么样,才能对症下药。我刚开始接触ISP pipeline时,总觉得把噪声当成高斯白噪声处理就完事了。结果呢?降噪一强,细节糊成一片;降噪一弱,暗部全是彩点。后来才明白——传感器噪声是多种物理过程的叠加,每种噪声都有自己的统计特性和频域分布。
这一节,我们拆开来看四个核心噪声源:光子散粒噪声、读出噪声、固定模式噪声(FPN)和暗电流。嗯,它们共同构成了你拍到的每一张RAW图里的噪声基底。
3.1 光子散粒噪声(Shot Noise)
这是最根本的噪声,物理上躲不开。光本质上是一份一份的光子,到达传感器的过程服从泊松分布。你想想看,即使用最理想的光源、最完美的传感器,光子到达的时间和数量也是随机的。
散粒噪声的方差等于信号均值:
σ²_shot = μ_photo
这意味着什么?信号越强,散粒噪声的值越大。但信噪比(SNR)会随信号增强而提高——因为SNR = μ / √μ = √μ。所以暗部区域的散粒噪声问题远比亮部严重。
关键特性:
- 与信号相关,信号越强噪声越大
- 服从泊松分布,非高斯
- 在空间上不相关,属于白噪声
- 在暗部区域(低光子数)影响最显著
我在项目中遇到过一个问题:用传统高斯降噪算法处理暗光RAW图,结果暗部出现奇怪的条纹。后来排查发现,散粒噪声在低信号区呈明显的泊松分布,高斯假设失效了。从那以后,我习惯在降噪前先做方差稳定化变换(如Anscombe变换),把泊松噪声近似转为高斯噪声再处理。
3.2 读出噪声(Read Noise)
读出噪声是传感器将电荷转换为电压、再经过ADC量化过程中引入的噪声。它和信号无关——哪怕你把镜头盖盖上,读出噪声依然存在。
读出噪声通常包含几个分量:
| 分量 | 来源 | 特性 |
|---|---|---|
| 复位噪声(kTC噪声) | 像素复位开关的热噪声 | 与电容和温度相关 |
| 源跟随器噪声 | 像素内放大器的热噪声和1/f噪声 | 低频成分明显 |
| ADC量化噪声 | 模数转换的量化误差 | 均匀分布,与量化位数相关 |
| 列放大器噪声 | 列并行读出的放大器差异 | 表现为列方向条纹 |
读出噪声的典型值在1-10 e⁻(电子数)之间,高端科学级传感器可以做到<1 e⁻。我建议你在评估传感器性能时,重点关注读出噪声的均方根值——它直接决定了传感器的动态范围下限。
避坑指南:我曾经在调试一款手机传感器时,发现暗部出现周期性横条纹。查了半天,结果是列读出电路的时序抖动导致的。解决方法是做列相关双采样(CDS)——在像素复位后和读出前各采样一次,相减消除固定偏置和低频噪声。
3.3 固定模式噪声(FPN)
FPN是传感器阵列中每个像素的响应不一致性导致的。它不随时间变化,但随空间位置变化——说白了就是每个像素有自己的"小脾气"。
FPN分为两类:
- 像素FPN(Pixel FPN):每个像素的暗电平偏移和增益差异,表现为固定图案
- 列FPN(Column FPN):列读出电路的偏置差异,表现为垂直条纹
FPN的数学模型很简单:
I_out(x,y) = G(x,y) · I_in(x,y) + O(x,y)
其中G(x,y)是增益非均匀性,O(x,y)是暗电平偏移。这两个参数在传感器出厂时就基本固定了。
怎么处理FPN?我个人的经验是两步走:
- 暗场校正:盖上镜头盖拍一张全黑图,统计每个像素的暗电平偏移O(x,y)
- 亮场校正:拍一张均匀光照的灰卡,计算每个像素的增益校正系数G(x,y)
注意:FPN会随温度和曝光时间漂移。特别是温度升高时,暗电平偏移会明显增大。我建议在量产标定时,至少采集3个温度点(如-10°C、25°C、60°C)的FPN数据,做温度插值补偿。
3.4 暗电流(Dark Current)
暗电流是传感器在没有光照时,由于热激发产生的电子-空穴对。它和温度的关系非常密切——温度每升高6-8°C,暗电流翻倍。
暗电流的组成:
| 成分 | 来源 | 温度依赖性 |
|---|---|---|
| 扩散暗电流 | 耗尽区外热激发载流子扩散 | ∝ T² · exp(-Eg/kT) |
| 耗尽区暗电流 | 耗尽区内热激发 | ∝ T¹·⁵ · exp(-Eg/2kT) |
| 表面暗电流 | Si-SiO₂界面缺陷 | ∝ T · exp(-Eg/2kT) |
暗电流的典型值在室温下约为10-100 pA/cm²,长曝光(如天文摄影)时暗电流会积累成明显的亮度偏移和固定图案。
处理暗电流,我常用的方法:
- 暗帧减法:拍摄与主图相同曝光时间和温度的暗帧,逐像素相减
- 暗电流建模:建立温度-曝光时间-暗电流的映射模型,实时补偿
- 硬件制冷:科学级相机常用TEC制冷到-20°C以下,暗电流可降低几个数量级
实战经验:有一次做安防相机的低照度增强,发现长曝光(2秒以上)时画面出现明显的"热像素"——个别像素异常亮。排查发现是暗电流不均匀导致的。解决方案是:先做暗帧减法去除整体暗电流,再用中值滤波检测并替换热像素。嗯,效果立竿见影。
3.5 噪声模型总览
把上面四种噪声综合起来,一个完整的传感器噪声模型可以写成:
I_observed = G · (I_true + N_shot + N_dark) + N_read + N_FPN
其中:
- N_shot ~ Poisson(μ_photo) —— 散粒噪声
- N_dark ~ Poisson(μ_dark) —— 暗电流噪声
- N_read ~ N(0, σ²_read) —— 读出噪声(近似高斯)
- N_FPN —— 固定模式噪声(空间相关)
- G —— 传感器增益(ISO相关)
这个模型是后续所有降噪算法的基础。你想想看,如果不区分噪声类型,一股脑用同一个滤波器处理,结果必然是顾此失彼。
3.6 噪声参数标定
理论模型有了,怎么拿到实际参数?我分享一套我自己常用的标定流程:
- 暗场采集:盖上镜头盖,在不同ISO和曝光时间下拍10-20张暗帧
- 亮场采集:拍均匀灰卡(18%灰),同样覆盖不同ISO
- 光子转移曲线(PTC):计算亮场的均值-方差关系,拟合出系统增益K和读出噪声σ_read
- FPN提取:对暗帧取平均,得到固定偏移O(x,y);对亮帧做归一化,得到增益非均匀性G(x,y)
- 暗电流建模:在不同温度下采集暗帧,拟合暗电流-温度曲线
核心公式:光子转移曲线(Photon Transfer Curve)
σ²_total = K · μ_signal + σ²_read
其中K是系统增益(e⁻/DN),μ_signal是信号均值(DN),σ²_read是读出噪声方差(DN²)。通过线性拟合,斜率的倒数就是增益K,截距就是读出噪声方差。
嗯,这套流程我几乎在每个项目中都会跑一遍。不同传感器、不同ISP参数下的噪声特性差异很大,没有标定就没有针对性的降噪。