2. 多帧降噪的基本原理:时域滤波的核心思想
好,咱们直接进入正题。多帧降噪,说白了就是「拍很多张,然后叠在一起」。你可能会问:就这么简单?嗯,原理上确实不复杂,但里面的门道可不少。我在项目里见过不少人,叠完发现画面糊了,或者噪点还在——那就是没搞懂时域滤波到底在干什么。
2.1 时域滤波:让像素自己投票
先想一个问题:一张夜景照片里,某个像素点的亮度值,为什么是「真实信号 + 随机噪声」?
噪声是随机的。它今天可能 +10,明天可能 -8,平均下来趋近于 0。而真实信号是稳定的。你拍同一个场景,真实亮度不会变。
所以,时域滤波的核心思想就是:让多个时间点的像素值「投票」,选出最接近真实值的结果。
核心公式(直觉版)
输出像素 = (帧1像素 + 帧2像素 + ... + 帧N像素) / N
噪声被平均掉了,信号被保留下来了。
我在做第一个夜景项目时,直接用了这个公式。结果呢?画面是干净了,但运动物体拖影严重。后来才意识到——时域滤波的前提是「场景静止」。如果物体在动,你还硬平均,那就出问题了。这个坑我后面会细讲。
2.2 多帧叠加为什么能降噪?
咱们从数学上走一遍。假设每帧的噪声是独立同分布的高斯白噪声,均值为 0,方差为 σ²。
单帧的信噪比(SNR)定义为:
SNR_single = 信号功率 / 噪声功率 = S / σ²
现在,我们把 N 帧叠加起来。信号部分:
S_total = S + S + ... + S = N × S
噪声部分呢?因为噪声是独立的,叠加后功率是各帧噪声功率之和:
σ²_total = σ² + σ² + ... + σ² = N × σ²
叠加后的信噪比:
SNR_sum = (N × S) / (N × σ²) = S / σ²
等等,好像没变?别急,我们还要做一步——取平均。平均后的信号:
S_avg = (N × S) / N = S
平均后的噪声:
σ²_avg = (N × σ²) / N² = σ² / N
所以平均后的信噪比:
SNR_avg = S / (σ² / N) = N × (S / σ²) = N × SNR_single
结论:N 帧平均,信噪比提升 N 倍(线性关系)。
用分贝表示:SNR 提升 = 10 × log10(N) dB
举个例子:4 帧叠加,SNR 提升 10×log10(4) ≈ 6 dB。16 帧叠加,提升 12 dB。你想想看,12 dB 是什么概念?人眼能明显感觉到画面干净了一大截。
2.3 信噪比提升的数学推导(严谨版)
咱们用更正式的符号走一遍。设第 i 帧的像素值为:
I_i(x,y) = S(x,y) + N_i(x,y)
其中 S 是真实信号(与帧数无关),N_i 是第 i 帧的噪声,满足:
- E[N_i] = 0
- Var[N_i] = σ²
- Cov[N_i, N_j] = 0, i ≠ j
N 帧平均后的估计值:
Î(x,y) = (1/N) × Σ I_i(x,y) = S(x,y) + (1/N) × Σ N_i(x,y)
估计值的期望:
E[Î] = S + (1/N) × Σ E[N_i] = S
——无偏估计,漂亮。
估计值的方差:
Var[Î] = (1/N²) × Σ Var[N_i] = (1/N²) × N × σ² = σ² / N
信噪比(功率比):
SNR = E[Î]² / Var[Î] = S² / (σ² / N) = N × (S² / σ²)
我的经验: 实际项目中,噪声往往不是完美的高斯白噪声。比如 sensor 的读出噪声、光子散粒噪声、量化噪声,它们的统计特性不一样。我建议你至少用 8-16 帧起步,效果才明显。低于 4 帧,提升有限,不值得做。
2.4 时域滤波的两种实现路径
| 方法 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| 简单平均 | 所有帧等权叠加 | 实现简单,数学最优(噪声独立时) | 运动场景拖影严重 |
| 递归滤波 | 当前帧与历史结果加权融合 | 内存占用小,可实时 | 有滞后效应,参数调不好会糊 |
简单平均适合静态场景,比如天文摄影、固定机位夜景。递归滤波适合视频流,比如手机夜景模式里的实时预览。
曾经踩过的坑: 我在一个安防项目里用了递归滤波,α 设成 0.9(历史权重 0.9,当前帧 0.1)。结果画面倒是干净,但有人走过时,身后拖了一条长长的「鬼影」。后来我把 α 降到 0.7,配合运动检测,才解决。记住:递归滤波的 α 不是越大越好,要平衡降噪和响应速度。
2.5 知识结构图:多帧降噪的核心逻辑
2.6 实际项目中的注意事项
- 帧数不是越多越好。 超过 32 帧后,提升曲线变平,而且存储和计算开销直线上升。我一般控制在 8-16 帧。
- 运动检测是必须的。 不做运动检测的时域滤波,就是「静态场景专用」。手机夜景模式之所以能拍运动物体,是因为做了像素级的运动补偿。
- 噪声模型要匹配。 如果 sensor 的噪声主要是散粒噪声(与信号相关),简单平均的效果会打折扣。这时候需要先做方差稳定变换。
一个小技巧: 如果你用递归滤波,可以动态调整 α。运动区域 α 设小一点(比如 0.3),静止区域 α 设大一点(比如 0.9)。这样既能降噪,又能保住运动细节。我在一个无人机航拍项目里就是这么干的,效果比固定 α 好很多。
好了,这一节的核心就这些。时域滤波是基础,后面的运动估计、融合策略都建立在这个框架上。你先把「N 帧平均 SNR 提升 N 倍」这个结论刻在脑子里,后面就好理解了。