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
实战建议:在安防监控系统中,我通常这样组合使用:先用中值滤波去除椒盐噪声(如果存在),再用双边滤波做精细降噪并保留边缘。两步走比一步到位效果更可控。
嗯,空域降噪就讲到这里。记住一点:没有万能的滤波器,只有合适的参数组合。多试几次,找到画面质量和降噪效果的平衡点,这才是调优的真谛。