2. 噪声模型基础:光子噪声、读出噪声、暗电流噪声的数学建模

做HDR去噪,你得先知道噪声从哪来。

很多人一上来就调参数、试滤波器,结果暗部提亮了,噪点也跟着放大了。说白了,就是没搞懂噪声的“脾气”。

这一章,我们就把三种最核心的噪声模型掰开揉碎。数学公式我会给,但更重要的是——你得知道它们在实际图像里长什么样。

2.1 光子噪声(散粒噪声)——躲不掉的物理宿命

光本身就是离散的光子。传感器每个像素接收到的光子数,不是固定的,而是服从泊松分布。

我刚开始做传感器标定时,总觉得这玩意儿太理论。直到有一次,我用同一台相机对着均匀灰板连拍100张,发现每张的像素值都不一样——嗯,这就是光子噪声在作怪。

核心公式:

光子数 N ~ Poisson(λ),其中 λ 是期望光子数。

噪声标准差 σ_shot = √λ

信噪比 SNR = λ / √λ = √λ

你看,信号越强(λ越大),信噪比越高。暗部区域λ很小,噪声就特别明显。这也是为什么提亮暗部时,噪点会跟着放大——因为底子里的信噪比本来就低。

场景 期望光子数 λ 噪声标准差 √λ 信噪比 (dB)
强光区域 10000 100 40 dB
中等亮度 1000 31.6 30 dB
暗部区域 100 10 20 dB
极暗区域 10 3.16 10 dB

这张表我建议你记一下。做HDR合成时,不同曝光帧的噪声水平差异很大,融合权重就得按这个来设计。

2.2 读出噪声——电路里的“底噪”

光子转成电子,电子再转成电压,最后被ADC量化。每一步都会引入噪声。

读出噪声是加性的,跟信号强度无关。你想想看,就算完全遮住镜头(零光输入),读出电路依然会输出一个非零值——这就是读出噪声的“本色”。

个人经验: 我测试过一款工业相机,它的读出噪声大约是 2.5 e⁻(电子数)。这意味着即使信号为0,你也会看到大约2-3个灰度级的随机波动。暗部提亮时,这个噪声会被线性放大,非常讨厌。

读出噪声的数学模型很简单:

σ_read² = σ_ADC² + σ_amp² + σ_kTC²

其中:

  • σ_ADC²:量化噪声,通常为 1/12 LSB²
  • σ_amp²:放大器噪声,与增益相关
  • σ_kTC²:复位噪声,与像素电容和温度相关

实际项目中,读出噪声通常用“暗场标准差”来测量。我建议你每次做标定时,先拍一张暗帧(盖上镜头盖),算一下标准差——这就是你当前系统的读出噪声基底。

2.3 暗电流噪声——温度是元凶

即使没有光,传感器内部的硅晶格热振动也会产生电子。这些“热生电子”就是暗电流。

暗电流跟曝光时间成正比,跟温度呈指数关系。温度每升高6-8°C,暗电流翻一倍。我在夏天做长曝光测试时,暗电流噪声能比冬天高4-5倍。

避坑指南: 我曾经在35°C环境下做30秒长曝光HDR,结果暗部全是“热像素”。后来加了TEC制冷,暗电流降了两个数量级。如果你做的是手机摄影算法,一定要考虑温升对暗电流的影响。

暗电流噪声的数学模型:

I_dark = I_0 × exp(-E_a / (k × T)) × t_exp

其中:

  • I_0:与工艺相关的常数
  • E_a:激活能(硅通常为 0.6 eV)
  • k:玻尔兹曼常数
  • T:温度 (K)
  • t_exp:曝光时间

暗电流噪声也是泊松分布,因为它是随机热激发产生的。所以它的标准差 σ_dark = √(I_dark)。

2.4 三种噪声的叠加模型

实际传感器输出的总噪声,是这三种噪声的叠加。我习惯用下面的公式来建模:

σ_total² = σ_shot² + σ_read² + σ_dark²
         = λ + σ_read² + I_dark

注意:光子噪声和暗电流噪声都是信号相关的(泊松分布),读出噪声是信号无关的。这个区别很重要——做去噪时,你得针对不同噪声类型设计不同的滤波器。

下面这张图展示了三种噪声在不同信号强度下的贡献比例:

三种噪声贡献比例随信号强度变化 信号强度 (光子数 λ) 低 中 高 噪声贡献比例 光子噪声 读出噪声 (恒定) 暗电流噪声 总噪声 关键观察: 暗部区域:读出噪声占主导 中间区域:光子噪声开始显现 亮部区域:光子噪声占主导

2.5 实际应用中的噪声参数标定

理论讲完了,咱们来点实际的。怎么测出你手里相机的噪声参数?

我常用的方法:

  1. 暗帧法测读出噪声: 盖上镜头盖,拍10张暗帧,计算像素值标准差。这就是读出噪声的近似值。
  2. 变曝光时间测暗电流: 同样暗场,分别拍1秒、2秒、4秒、8秒。拟合暗电流随时间的增长曲线。
  3. 均匀光照测光子噪声: 对着均匀灰板,拍多张照片。总噪声减去读出噪声和暗电流,剩下的就是光子噪声。

小技巧: 我习惯用Python的numpy.polyfit做线性拟合。暗电流噪声的斜率就是暗电流速率(单位:e⁻/s),读出噪声就是截距。整个过程10分钟搞定。

有了这些参数,你就能精确预测任意曝光条件下的噪声水平。做HDR去噪时,每个像素的噪声方差都可以实时计算出来——这就是自适应去噪的基础。