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 知识结构图:多帧降噪的核心逻辑

多帧降噪核心逻辑 多帧输入序列 核心原理:时域滤波 噪声随机 → 平均趋零;信号稳定 → 保留 简单平均(等权叠加) 递归滤波(加权融合) SNR 提升 = N 倍 10×log10(N) dB α 参数控制平滑度 α 越大越平滑,响应越慢 降噪后输出帧

2.6 实际项目中的注意事项

  • 帧数不是越多越好。 超过 32 帧后,提升曲线变平,而且存储和计算开销直线上升。我一般控制在 8-16 帧。
  • 运动检测是必须的。 不做运动检测的时域滤波,就是「静态场景专用」。手机夜景模式之所以能拍运动物体,是因为做了像素级的运动补偿。
  • 噪声模型要匹配。 如果 sensor 的噪声主要是散粒噪声(与信号相关),简单平均的效果会打折扣。这时候需要先做方差稳定变换。

一个小技巧: 如果你用递归滤波,可以动态调整 α。运动区域 α 设小一点(比如 0.3),静止区域 α 设大一点(比如 0.9)。这样既能降噪,又能保住运动细节。我在一个无人机航拍项目里就是这么干的,效果比固定 α 好很多。

好了,这一节的核心就这些。时域滤波是基础,后面的运动估计、融合策略都建立在这个框架上。你先把「N 帧平均 SNR 提升 N 倍」这个结论刻在脑子里,后面就好理解了。