3、时域滤波基础:帧平均法与帧累加法
聊到多帧降噪,绕不开的就是时域滤波。说白了,就是把多张图在时间轴上“揉”在一起。最基础的两个方法——帧平均法和帧累加法,是所有高级算法的地基。我当年刚接触这个方向时,觉得这俩不就是“多拍几张取平均”嘛,有啥好研究的?后来在真机上一跑,才发现门道多着呢。
3.1 帧平均法:原理与推导
帧平均法的思路非常直观:对同一场景连续拍摄 N 帧,然后把每个像素位置上的值加起来除以 N。
假设第 i 帧在像素 (x,y) 处的观测值为:
F_i(x,y) = S(x,y) + N_i(x,y)
其中 S(x,y) 是真实信号(我们想要的),N_i(x,y) 是随机噪声(均值为 0,方差为 σ²)。
经过 N 帧平均后:
F_avg(x,y) = (1/N) * Σ F_i(x,y)
= S(x,y) + (1/N) * Σ N_i(x,y)
噪声项的方差变成了 σ²/N。嗯,这里要注意——噪声的功率(方差)降到了原来的 1/N,但噪声的标准差(也就是噪声幅度)降到了原来的 1/√N。
核心结论:帧平均法使信噪比提升 √N 倍。这就是著名的 √N 法则。
3.2 帧累加法:另一种思路
帧累加法和平均法本质上是“双胞胎”。它不做除法,直接把 N 帧加起来:
F_sum(x,y) = Σ F_i(x,y) = N * S(x,y) + Σ N_i(x,y)
信号变成了原来的 N 倍,噪声标准差变成了原来的 √N 倍。信噪比同样是提升 √N 倍。
你可能会问:“那它俩有啥区别?”
区别在于数据位宽和后续处理。帧累加法输出的是累加和,数值范围会随 N 线性增长。比如 8-bit 图像,累加 16 帧后最大值可能到 4080,需要 12-bit 甚至更高位宽来存。帧平均法输出范围不变,但需要做一次除法。
| 对比项 | 帧平均法 | 帧累加法 |
|---|---|---|
| 输出范围 | 与单帧相同 | N 倍于单帧 |
| 位宽需求 | 不变 | 增加 log₂(N) bit |
| 除法开销 | 需要 | 不需要 |
| 信噪比提升 | √N | √N |
| 典型场景 | 实时预览、视频 | 长曝光、HDR 合成 |
3.3 √N 法则的数学推导
我们来严格推一遍。信噪比 SNR 定义为信号功率与噪声功率之比:
SNR = (信号幅度)² / (噪声方差)
单帧时:
SNR_single = S² / σ²
N 帧平均后,信号不变,噪声方差变为 σ²/N:
SNR_avg = S² / (σ²/N) = N * (S²/σ²) = N * SNR_single
用 dB 表示:
SNR_avg(dB) = SNR_single(dB) + 10 * log₁₀(N)
举个例子:4 帧平均提升 6dB,16 帧平均提升 12dB。我在项目中遇到过,有些同学以为帧数翻倍 SNR 就翻倍,其实不是——SNR 提升和 √N 成正比,收益是递减的。从 4 帧到 16 帧,帧数翻了 4 倍,SNR 只提升了 6dB。
经验之谈:我个人习惯把帧数控制在 8-16 帧。再往上加,收益越来越小,但运动模糊和存储开销会直线上升。8 帧能提 9dB,16 帧提 12dB,这 3dB 的差距在实际画面上并不明显。
3.4 适用场景分析
帧平均法和帧累加法不是万能的。它们有一个致命前提:场景必须静止。
- 适合的场景:
- 夜景长曝光(三脚架固定拍摄)
- 显微成像(样本不动)
- 天文摄影(跟踪赤道仪)
- 工业检测(流水线暂停时)
- 不适合的场景:
- 手持夜景(手抖导致帧间偏移)
- 运动物体(行人、车辆)
- 视频降噪(帧间变化大)
我曾经在手持夜景项目里硬套帧平均法,结果拍出来的照片边缘全是重影。后来才意识到,必须先做图像配准,把帧间偏移对齐了再平均。这就是后面章节要讲的“运动补偿”技术。
3.5 内存开销分析
这是工程实现里最容易被忽视的问题。我们算一笔账:
假设传感器输出 12-bit RAW 图,分辨率 4000×3000(1200 万像素)。
- 单帧 RAW 数据:4000 × 3000 × 2 字节 = 24 MB
- 帧平均法:需要缓存 N 帧还是只维护累加和?
- 朴素实现:缓存 N 帧 → N × 24 MB。N=8 时就是 192 MB,嵌入式设备直接爆了。
- 优化实现:只维护一个累加缓冲区(32-bit 浮点)→ 4000 × 3000 × 4 = 48 MB,再加当前帧 24 MB,总共 72 MB。
- 帧累加法:同样需要累加缓冲区,但可以用 16-bit 或 32-bit 整型,看 N 的大小。
| 实现方式 | 内存占用(8帧,12MP) | 特点 |
|---|---|---|
| 朴素帧平均(缓存 N 帧) | 192 MB | 简单但内存爆炸 |
| 滑动帧平均(累加缓冲区) | 72 MB | 内存可控,需除法 |
| 帧累加(整型累加) | 48~96 MB | 无除法,位宽需扩展 |
避坑指南:我曾经在手机 ISP 上实现帧累加,没注意位宽扩展。累加 16 帧后,12-bit 数据溢出到 16-bit 变量里,结果画面出现条纹状截断。后来改成 32-bit 累加才解决。记住:累加前先算好最大位宽,别省那点内存。
3.6 核心知识结构
下面这张图把本章的核心逻辑串起来了:
从这张图可以看得很清楚:两种方法殊途同归,最终都落在 √N 法则上。区别在于工程实现时的取舍——你是想省除法,还是想省位宽?你是做实时预览,还是做后期合成?这些选择会直接影响你的架构设计。
我个人更倾向于在移动端用帧累加法,省掉除法可以少占用一个 DSP 流水线。但在 PC 端或者云端,帧平均法更通用,因为后续处理流程通常期望输入范围是标准的 8-bit 或 12-bit。