3、时域滤波基础:帧间平均法、加权帧平均、运动自适应时域滤波
多帧HDR合成,说白了就是拿多张不同曝光的照片拼一张动态范围更大的图。但这里有个麻烦——每张图都带着噪声,合成时噪声也会跟着叠加。怎么在保留细节的同时把噪声压下去?时域滤波就是干这个的。
我个人习惯把时域滤波理解成「让多帧画面互相帮忙」。一帧有噪声,多帧平均一下,噪声就弱了。听起来简单,但实际落地时坑不少。今天咱们就把三种最基础的方法掰开揉碎讲清楚。
3.1 帧间平均法:最朴素的降噪手段
帧间平均法,就是直接把连续几帧的像素值加起来取平均。假设你有N帧图像,每个像素位置上的输出就是这N帧对应像素的均值。
数学上很简单:
I_out(x,y) = (1/N) * Σ I_k(x,y) (k=1 to N)
为什么它能降噪?因为噪声通常符合零均值分布。多帧平均后,噪声的方差会降到原来的1/N。N越大,噪声越小。
关键指标:
- N=4时,噪声标准差降为原来的1/2
- N=16时,降为1/4
- N=64时,降为1/8
我在项目中遇到过一个问题:用帧间平均法处理静态场景效果很好,但一旦画面里有运动物体,结果就惨不忍睹——运动物体会留下鬼影,像幽灵一样拖在后面。
避坑指南:我曾经在一个安防监控项目里直接用帧间平均法处理夜间视频,结果人走过去之后留下了半透明的拖尾。后来才意识到,帧间平均法只适合静态场景,或者运动极慢的场景。
帧间平均法的优缺点很明显:
| 优点 | 缺点 |
|---|---|
| 实现简单,计算量小 | 无法处理运动物体 |
| 降噪效果可预测 | 需要多帧缓存 |
| 无参数调优 | 对场景变化敏感 |
| 适合静态场景 | 边缘细节会模糊 |
3.2 加权帧平均:给不同帧不同权重
帧间平均法把所有帧一视同仁,这其实不太合理。你想想看,当前帧的信息应该比历史帧更重要,因为场景可能在变化。加权帧平均就是解决这个问题的。
公式变成这样:
I_out(x,y) = Σ w_k * I_k(x,y) (k=1 to N)
其中 Σ w_k = 1
权重怎么分配?我常用的策略有两种:
- 指数衰减权重:越老的帧权重越小,比如 w_k = α^(N-k),α在0.7~0.9之间
- 基于置信度的权重:根据帧的曝光质量、噪声水平动态调整权重
我的经验:在HDR合成中,我习惯给中间曝光帧更高的权重。因为过曝和欠曝帧的噪声特性不同,中间帧通常信噪比最高。权重分配可以这样:中间帧0.5,相邻帧各0.2,最远帧各0.05。
加权帧平均比简单平均灵活得多,但有个问题——权重是全局固定的。如果画面局部有运动,全局权重无法适应,该糊的地方还是糊。
3.3 运动自适应时域滤波:动静分开处理
这才是真正实用的方案。运动自适应时域滤波的核心思想是:静态区域多平均,运动区域少平均。
怎么做?先检测运动,再根据运动强度调整滤波强度。
基本流程如下:
1. 计算当前帧与参考帧的帧差
2. 对帧差做阈值判断,生成运动掩膜
3. 根据运动掩膜,逐像素调整时域滤波强度
4. 静态像素:强滤波(接近帧间平均)
5. 运动像素:弱滤波(保留细节)
我常用的运动检测方法有两种:
| 方法 | 原理 | 优缺点 |
|---|---|---|
| 帧差法 | 直接计算像素差值 | 简单快速,但对噪声敏感 |
| 结构相似度(SSIM) | 比较局部纹理结构 | 更鲁棒,但计算量大 |
运动自适应滤波的公式可以写成:
I_out = (1 - α(x,y)) * I_curr + α(x,y) * I_prev
其中 α(x,y) 是运动自适应系数
运动区域:α → 0(几乎不滤波)
静态区域:α → 0.8~0.9(强滤波)
核心要点:运动自适应滤波的关键在于运动检测的准确性。检测太敏感,降噪效果差;检测太迟钝,鬼影又会出现。我一般会在运动检测前加一个高斯滤波,先平滑掉一部分噪声,这样运动检测会更稳定。
3.4 三种方法的对比与选择
这三种方法不是互斥的,实际项目中往往是组合使用。我整理了一张对比表:
| 方法 | 降噪能力 | 运动处理 | 计算复杂度 | 适用场景 |
|---|---|---|---|---|
| 帧间平均法 | 强(N越大越强) | 无 | 低 | 静态场景、三脚架拍摄 |
| 加权帧平均 | 中等 | 弱(全局权重) | 低 | 缓慢变化场景 |
| 运动自适应滤波 | 强(分区域) | 强 | 中高 | 手持拍摄、有运动物体 |
我个人建议:如果场景基本不动,直接用帧间平均法,简单高效。如果有轻微运动,用加权帧平均。如果运动复杂,必须上运动自适应滤波。
曾经踩过的坑:我在一个手机HDR项目里,一开始用了全局的运动自适应滤波,结果发现天空区域因为云朵缓慢移动被误判为运动区域,导致天空降噪不足。后来加了基于区域的运动检测,把天空和地面分开处理,效果才好了。
3.5 知识体系结构图
下面这张图展示了三种时域滤波方法的关系和适用边界:
3.6 实际项目中的选择策略
说了这么多理论,到底怎么选?我分享一个实际项目中的决策流程:
- 先判断场景类型:静态还是动态?
- 静态场景:直接用帧间平均法,N取8-16帧,效果就很好了
- 动态场景:上运动自适应滤波,运动检测阈值要反复调
- 资源受限(比如手机端):用加权帧平均,权重用指数衰减,计算量小
- 质量优先(比如专业相机):用运动自适应滤波,配合局部运动检测
一个小技巧:我习惯在运动自适应滤波里加一个「运动历史」机制。如果某个像素连续多帧都被检测为运动,就降低它的滤波强度。这样可以避免闪烁——就是那种静止背景因为噪声被误判为运动,导致滤波强度忽高忽低的问题。