2. 实时降噪算法概览:空间域、频率域与时域滤波
降噪这事儿,说白了就是在「保留细节」和「抹掉噪声」之间找平衡。我做了这么多年图像处理,见过太多调参调到头秃的案例——要么画面糊成一片,要么噪声纹丝不动。今天咱们就把三大类滤波方法掰开揉碎了讲清楚。
核心思路:实时降噪没有银弹。空间域快但容易丢细节,频率域精准但计算重,时域效果好但怕运动。实际项目中往往是三者的组合拳。
2.1 空间域滤波:最直接的降噪方式
空间域滤波,就是直接在像素点上做运算。每个输出像素的值,由它周围邻域内的像素共同决定。你想想看,这就像拿一个「小窗口」在图像上滑动,窗口中心的值被邻居们「投票」决定。
2.1.1 均值滤波
最简单的做法。把窗口内所有像素取平均,赋值给中心点。我记得刚入行时觉得这方法太粗暴了,后来发现它在某些场景下其实很管用——比如去除均匀分布的高斯噪声。
// 3x3 均值滤波核
float kernel[3][3] = {
{1/9, 1/9, 1/9},
{1/9, 1/9, 1/9},
{1/9, 1/9, 1/9}
};
⚠ 避坑指南:我曾经在一个工业检测项目里直接用均值滤波,结果边缘全糊了,缺陷检测率直接掉到60%。均值滤波最大的问题就是「一视同仁」——它不管你是不是边缘,统统拉平。所以后来我养成了习惯:用均值滤波前,先做边缘检测,只在平坦区域应用。
2.1.2 高斯滤波
高斯滤波给邻域像素加了权重——离中心越近,权重越大。这比均值滤波聪明多了。我个人习惯用 σ=1.0 的 5×5 高斯核做轻度降噪,效果很自然。
| 滤波类型 | 核大小 | σ 值 | 适用场景 |
|---|---|---|---|
| 轻度降噪 | 3×3 | 0.8 | 传感器热噪声 |
| 中度降噪 | 5×5 | 1.2 | 低光照环境 |
| 重度降噪 | 7×7 | 2.0 | 极低信噪比场景 |
💡 我的经验:高斯滤波的 σ 值不要超过核半径。比如 5×5 的核,σ 最大设到 2.0 就够了。再大,外围像素权重几乎为零,等于白算。
2.1.3 中值滤波
中值滤波把窗口内像素排序,取中间值。这招对付椒盐噪声简直是绝杀。我做过一个安防摄像头项目,画面里全是黑白噪点,均值和高斯都搞不定,换成中值滤波,一帧就干净了。
但中值滤波有个致命伤——慢。排序操作在嵌入式设备上很吃性能。我建议只在椒盐噪声明显的场景用,或者用快速中值算法(比如 O(1) 的中值滤波实现)。
2.2 频率域滤波:从另一个维度看问题
空间域搞不定的时候,试试频率域。说白了就是把图像从像素空间变换到频率空间——噪声通常集中在高频区域,细节也在高频,但两者的频率分布有差异。
2.2.1 低通滤波
低通滤波保留低频(平滑区域),抑制高频(噪声和边缘)。我建议用巴特沃斯低通滤波器,它的过渡带比理想低通更平滑,不会产生振铃效应。
// 巴特沃斯低通滤波器传递函数
// D0: 截止频率, n: 阶数
float H = 1.0 / (1.0 + pow(D(u,v) / D0, 2*n));
关键参数:截止频率 D0 决定了保留多少细节。D0 太小,图像模糊;D0 太大,噪声没滤干净。我一般从 D0 = 图像尺寸的 10% 开始调,上下浮动 5% 看效果。
2.2.2 带阻滤波
带阻滤波针对特定频率范围的噪声。比如 50Hz 的工频干扰、莫尔条纹,这些噪声在频谱上表现为一个「亮环」。用带阻滤波器把这个环挖掉就行。
我记得有一次处理医疗内窥镜图像,画面里全是周期性条纹。空间域怎么搞都搞不干净,转到频率域一看,好家伙,一个明亮的圆环。用带阻滤波器精准切除,画面瞬间干净了。
2.3 时域滤波:让时间帮你降噪
时域滤波利用多帧信息。你想想看,噪声是随机的,但真实场景是稳定的。多帧平均一下,噪声就互相抵消了。
2.3.1 帧平均
最简单的时域方法。连续 N 帧取平均,噪声功率降低到原来的 1/N。但前提是场景不能动——动起来就重影了。
| 帧数 N | 噪声降低倍数 | 适用场景 |
|---|---|---|
| 2 | √2 ≈ 1.41 | 轻微抖动场景 |
| 4 | 2.0 | 静态场景 |
| 8 | 2.83 | 三脚架固定拍摄 |
⚠ 注意:帧平均不是帧数越多越好。N 超过 8 之后,降噪收益递减,但运动模糊的风险直线上升。我一般控制在 4-6 帧。
2.3.2 运动补偿
运动补偿解决了帧平均的「怕动」问题。先估计帧间的运动矢量,然后把前一帧的像素对齐到当前帧,再做平均。这样既降噪又不产生重影。
我曾经在手机视频防抖项目里用过运动补偿降噪。流程大概是:
- 用光流法或块匹配估计运动矢量
- 根据运动矢量 warp 前一帧
- 将 warp 后的帧与当前帧做加权平均
- 运动大的区域降低时域权重,防止拖影
💡 我的建议:运动补偿的计算量很大。在移动端,我通常只用 3×3 的块匹配,搜索范围控制在 ±4 像素。再大,功耗就压不住了。
2.4 三种滤波的对比与选择
| 维度 | 空间域 | 频率域 | 时域 |
|---|---|---|---|
| 计算量 | 低 | 高(需 FFT) | 中 |
| 降噪效果 | 一般 | 好 | 优秀(静态场景) |
| 细节保留 | 差 | 中 | 好 |
| 运动适应性 | 好 | 好 | 差(需运动补偿) |
| 实时性 | 优秀 | 一般 | 中 |