4. 空域降噪算法

空域降噪,说白了就是直接在图像像素点上做文章。不搞傅里叶变换,不折腾频域,就是拿一个窗口在图上滑来滑去,把每个像素和它邻居做运算。这四种滤波器——均值、高斯、中值、双边——是我在安防项目里用得最多的。它们各有脾气,调参不对,画面要么糊成一片,要么噪点纹丝不动。

4.1 均值滤波:简单但代价大

均值滤波的原理很直白:把窗口内所有像素的亮度值加起来,除以像素总数,用这个平均值替换中心像素。窗口大小通常是 3×3、5×5 或 7×7。

核心公式:

g(x,y) = (1/(m×n)) × Σ f(i,j)  其中 (i,j) ∈ 窗口

m×n 是窗口尺寸,f(i,j) 是原始像素值。

我在项目中遇到过这种情况:一个 200 万像素的枪机,画面里全是椒盐噪声,我图省事直接上了 5×5 均值滤波。结果噪声是没了,但监控画面里车牌上的数字边缘全糊了,连人都认不出来。嗯,这就是均值滤波的代价——它把边缘和噪声一起抹平了。

窗口大小 降噪强度 边缘保留 适用场景
3×3 弱 较好 轻度噪声、实时性要求高
5×5 中等 一般 中等噪声、不关注细节
7×7 强 差 强噪声、画面细节不重要

避坑指南:我曾经在夜间监控场景用过 7×7 均值滤波,结果画面里运动目标的拖影严重到无法追踪。均值滤波对高斯噪声有效,但对椒盐噪声效果很差——它会把黑白噪点扩散成一片灰斑。

4.2 高斯滤波:权重分配更合理

高斯滤波和均值滤波的区别在于:它不搞平均主义,而是根据像素到中心点的距离分配权重。距离越近,权重越大;距离越远,权重越小。权重由高斯函数决定。

高斯核生成示例(3×3,σ=1.0):

权重矩阵(归一化前):
[0.075, 0.124, 0.075]
[0.124, 0.204, 0.124]
[0.075, 0.124, 0.075]

归一化后,所有权重之和为 1。

我个人习惯在安防场景里优先用高斯滤波而不是均值滤波。为什么?因为高斯滤波更符合自然图像的统计特性——离得近的像素相关性更高。你想想看,监控画面里一个行人的衣服,相邻像素颜色变化是连续的,用高斯滤波能保留这种连续性。

调参时有两个关键参数:窗口大小和 σ(标准差)。窗口大小一般取 3σ 到 6σ 之间的奇数。σ 越大,权重分布越平坦,滤波效果越接近均值滤波。

σ 值 推荐窗口 效果
0.5 3×3 轻微平滑,保留细节
1.0 5×5 中等平滑,适合一般降噪
2.0 7×7 强平滑,细节损失明显

调参技巧:我建议先固定窗口大小为 5×5,然后从 σ=0.8 开始往上调,每次增加 0.2,观察画面边缘的清晰度。当发现文字边缘开始模糊时,往回退一档。

4.3 中值滤波:椒盐噪声的克星

中值滤波不搞加权平均,它把窗口内所有像素按亮度排序,取中间值替换中心像素。这招对椒盐噪声特别管用——因为椒盐噪声是极端值(要么特别亮要么特别暗),排序后它们会跑到两端,中间值基本不受影响。

我记得有一次处理地下车库的监控画面,摄像头老化导致画面里全是黑白噪点。均值滤波和高斯滤波都试过了,效果很差——噪点变成了一片灰蒙蒙的雾。最后上了 3×3 中值滤波,一次搞定,画面干净得像新摄像头拍的。

中值滤波处理椒盐噪声示例:

原始 3×3 窗口:
[120, 255, 118]   ← 255 是椒噪声(白点)
[122, 121, 119]
[117, 0,   123]   ← 0 是盐噪声(黑点)

排序后:[0, 117, 118, 119, 120, 121, 122, 123, 255]
中值:120

输出:用 120 替换中心像素,噪点被完美去除。
噪声类型 均值滤波 高斯滤波 中值滤波
高斯噪声 有效 有效 一般
椒盐噪声 差 差 优秀
均匀噪声 有效 有效 一般

注意:中值滤波的窗口不宜过大。我曾经试过 7×7 中值滤波处理一个行人密集的监控画面,结果行人边缘被严重腐蚀,看起来像鬼影。安防场景里,3×3 或 5×5 就够了。

4.4 双边滤波:边缘保留的王者

双边滤波是这四种里最聪明的。它同时考虑两个因素:空间距离和像素值差异。空间距离近的权重大,像素值相近的权重大。这样一来,在平坦区域它像高斯滤波一样平滑噪声,但在边缘处——因为边缘两侧像素值差异大——它会降低跨边缘像素的权重,从而保留边缘。

双边滤波权重公式:

权重 = 空间权重 × 像素值权重

空间权重 = exp(-(距离²)/(2×σ_s²))
像素值权重 = exp(-(像素差²)/(2×σ_r²))

σ_s 控制空间范围,σ_r 控制像素值范围。

调参是双边滤波的难点。两个参数要配合着调:σ_s 决定考虑多大范围的邻居,σ_r 决定多大的像素差异算边缘。

参数 调小 调大
σ_s(空间) 只考虑近邻,降噪弱 考虑范围广,降噪强但可能模糊
σ_r(像素值) 严格区分边缘,保留好 容忍差异大,可能模糊边缘

我的调参习惯:先固定 σ_s = 3(对应 7×7 窗口),然后从 σ_r = 10 开始试。σ_r 太小(比如 5)会导致降噪不足,太大(比如 50)则边缘保留效果退化。安防场景里,σ_r 在 15-30 之间通常效果不错。

4.5 四种算法对比与选型

下面这张图是我自己总结的选型逻辑,帮你快速决策:

空域降噪算法选型流程图 输入噪声图像 判断噪声类型 椒盐噪声 中值滤波 高斯/均匀噪声 高斯滤波 需要保留边缘? 是 双边滤波 否 均值/高斯滤波 提示:安防场景中,若画面包含文字、车牌、人脸等关键细节,优先选择双边滤波或中值滤波

四种算法各有适用场景。我个人的经验是:

  • 实时预览:用均值滤波或高斯滤波,速度快,参数少
  • 椒盐噪声严重:直接上中值滤波,别犹豫
  • 需要保留边缘细节:双边滤波是首选,但要注意调参
  • 算力受限:均值滤波最省资源,3×3 窗口几乎不占 CPU

实战建议:在安防监控系统中,我通常这样组合使用:先用中值滤波去除椒盐噪声(如果存在),再用双边滤波做精细降噪并保留边缘。两步走比一步到位效果更可控。

嗯,空域降噪就讲到这里。记住一点:没有万能的滤波器,只有合适的参数组合。多试几次,找到画面质量和降噪效果的平衡点,这才是调优的真谛。