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 帧输入图像 帧平均法 帧累加法 F_avg = (1/N) · Σ F_i 输出范围不变,需除法 F_sum = Σ F_i 输出范围 N 倍,位宽扩展 √N 法则:SNR 提升 √N 倍 适用场景:静止场景 内存开销:累加缓冲区 局限性:运动敏感

从这张图可以看得很清楚:两种方法殊途同归,最终都落在 √N 法则上。区别在于工程实现时的取舍——你是想省除法,还是想省位宽?你是做实时预览,还是做后期合成?这些选择会直接影响你的架构设计。

我个人更倾向于在移动端用帧累加法,省掉除法可以少占用一个 DSP 流水线。但在 PC 端或者云端,帧平均法更通用,因为后续处理流程通常期望输入范围是标准的 8-bit 或 12-bit。