3. 噪声模型与来源:光子散粒噪声、读出噪声、固定模式噪声(FPN)、热噪声与暗电流

做HDR最头疼的是什么?我个人的答案是噪声。

你想想看,多帧合成时,暗部提亮,噪声也跟着放大。如果不搞清楚噪声从哪来,你根本不知道怎么压它。这一章,咱们就把HDR pipeline里最常见的几种噪声,一个一个拆开看。

3.1 光子散粒噪声(Shot Noise)

这是物理极限决定的噪声,你躲不掉。光本身就是离散的光子,到达传感器的数量服从泊松分布。信号越弱,相对波动越大。

  • 来源:光子到达的随机性。
  • 特性:方差等于均值。信号翻倍,噪声只增加√2倍。
  • 影响:暗部区域最明显,亮部区域信噪比高。

关键公式:SNR = 10·log₁₀(N) dB,其中N是收集到的电子数。

举个例子:100个电子时,SNR只有20dB;10000个电子时,SNR是40dB。暗部画质差,根在这儿。

我在项目中遇到过一个问题:长曝光HDR合成后,暗部出现奇怪的颗粒感。排查了半天,发现不是算法问题,是短帧曝光时间太短,光子数太少,散粒噪声主导了暗部。后来我把短帧的ISO调高了一档,才压住。

3.2 读出噪声(Read Noise)

读出噪声是传感器把电荷转成电压、再转成数字信号时引入的。它跟信号强度无关,是个固定底噪。

噪声分量 来源 典型值(e⁻ rms)
复位噪声 像素复位开关的kT/C噪声 10-50
源跟随器噪声 像素内放大器的1/f和热噪声 5-20
列放大器噪声 列并行读出的放大器噪声 10-30
ADC量化噪声 模数转换的量化误差 0.5-2 LSB

避坑指南:我曾经在调试一款高帧率传感器时,发现读出噪声比datasheet标称值高了3倍。后来发现是PCB布局导致电源纹波耦合进了模拟读出链路。记住,读出噪声不只看传感器,还要看你的供电和走线。

3.3 固定模式噪声(FPN)

FPN是空间上的固定偏差。每个像素的暗电平、增益不完全一致,导致均匀光照下输出也不均匀。

  • 列FPN:同一列像素共享读出电路,列与列之间的偏差。表现为竖条纹。
  • 像素FPN:每个像素自身的暗电流和转换增益差异。表现为固定颗粒感。

注意:FPN在HDR多帧合成中会被放大。因为不同曝光帧的FPN模式相同,但增益不同,合成后会出现固定图案的强度变化。我建议在合成前先做一次暗场校正,把FPN减掉。

说白了,FPN就是传感器的“胎记”。你没法消除它,但可以校准它。我习惯在产线上做一次全黑帧和均匀灰帧的标定,生成校正矩阵。这样在pipeline里直接减掉就行。

3.4 热噪声与暗电流

温度每升高6-8°C,暗电流翻倍。热噪声是读出电路里电阻的热运动产生的,跟温度直接相关。

噪声类型 温度依赖性 典型表现
暗电流散粒噪声 每6-8°C翻倍 长曝光时出现固定亮斑
热噪声(Johnson-Nyquist) √T成正比 读出链路底噪升高

实战经验:做手机HDR时,连续拍摄多帧,传感器温度会从25°C升到45°C。暗电流翻4倍。如果不做温度补偿,长帧的暗部会明显偏亮。我当时的做法是:在每帧的空白行里嵌入温度传感器读数,然后查表调整暗电流校正参数。

3.5 噪声模型总览

把这些噪声综合起来,就得到了完整的噪声模型。下面这张图展示了HDR pipeline里噪声的叠加关系。

HDR噪声模型总览 入射光子 光电转换 光子 → 电子 ① 光子散粒噪声 读出电路 电荷 → 电压 → 数字 ② 读出噪声 ③ 固定模式噪声 数字输出 ④ 热噪声 + 暗电流

从图上可以清楚看到:光子散粒噪声在光电转换阶段就叠加了;读出噪声和FPN在读出电路阶段引入;热噪声和暗电流则贯穿整个传感器工作过程。HDR多帧合成时,这些噪声会被不同增益放大,最终在合成结果里呈现复杂的分布。

3.6 噪声抑制策略概览

知道了噪声来源,抑制策略就清晰了。我整理了一个对照表,方便你在实际项目中快速定位问题。

噪声类型 抑制策略 适用场景
光子散粒噪声 增加曝光时间/光圈/补光;多帧降噪 暗光HDR
读出噪声 优化PCB布局;使用低噪声ADC;相关双采样 高帧率/高增益
固定模式噪声 暗场校正;均匀场校正;列/像素校准 所有HDR场景
热噪声/暗电流 主动散热;温度补偿;短曝光优先 长曝光/高温环境

个人建议:做HDR系统设计时,先把读出噪声和FPN校准好,这两个是固定开销。剩下的散粒噪声和热噪声,才是算法要重点处理的。我曾经见过一个团队花三个月优化降噪算法,结果发现FPN根本没校准,白费功夫。

嗯,这一章的内容就到这儿。噪声模型是HDR处理的基石,搞懂了它,后面的降噪算法你才能用得心里有底。