4、图像滤波与去噪:均值滤波、高斯滤波、中值滤波、双边滤波的原理与对比

各位同学,欢迎来到第四讲。

今天咱们聊聊图像滤波。说白了,滤波就是去噪。你想想看,相机拍出来的照片,或多或少都有噪声。可能是传感器发热产生的,也可能是光线不足导致的。我刚开始做视觉项目时,就被噪声坑过好几次。后来才明白,预处理这步做不好,后面的算法再牛也白搭。

4.1 为什么需要滤波?

图像噪声,本质上就是像素值的随机波动。一个干净的区域,本该是平滑的,结果出现了几个异常亮或暗的点。滤波的目的,就是把这些异常点「抹平」,同时尽量保留图像的真实细节。

嗯,这里要注意:滤波是一把双刃剑。去噪太狠,图像会变模糊;去噪太轻,噪声还在。所以选对滤波方法,是门手艺活。

核心思想:用邻域像素的某种统计值,来替代当前像素值。邻域大小和统计方式,决定了滤波器的特性。

4.2 均值滤波

均值滤波是最简单的方法。它用一个窗口(比如3x3),计算窗口内所有像素的平均值,然后赋值给中心像素。

import cv2
import numpy as np

# 均值滤波
img = cv2.imread('noisy_image.jpg')
blurred = cv2.blur(img, (3, 3))  # 3x3窗口

我在项目中遇到过一个问题:用均值滤波处理一张夜景照片,结果边缘全糊了。为什么?因为均值滤波对窗口内所有像素一视同仁。边缘处的像素差异很大,一平均,边缘就没了。

避坑指南:我曾经在工业检测项目里用均值滤波,结果把细小的划痕也给滤掉了。后来才意识到,均值滤波只适合处理高斯噪声,对椒盐噪声效果很差。

4.3 高斯滤波

高斯滤波比均值滤波聪明一点。它不再简单平均,而是根据像素距离中心点的远近,分配不同的权重。离中心越近,权重越大;越远,权重越小。这个权重分布,就是高斯函数。

# 高斯滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1.5)  # 5x5窗口,sigma=1.5

你想想看,高斯滤波其实是在模拟人眼的视觉特性。人看东西时,也是中心清晰、边缘模糊。所以高斯滤波的效果比均值滤波更自然。

我个人习惯在预处理阶段先用高斯滤波。它速度快,效果稳定。但要注意sigma参数。sigma太小,滤波效果不明显;sigma太大,图像会过度模糊。我一般从1.0开始试,根据效果微调。

小技巧:窗口大小和sigma有个经验关系:sigma ≈ (窗口大小 - 1) / 6。比如5x5窗口,sigma取0.67左右。当然,这只是参考,具体还得看效果。

4.4 中值滤波

中值滤波的思路完全不同。它不再计算平均值,而是取窗口内所有像素的中间值。这招对付椒盐噪声特别有效。

# 中值滤波
median = cv2.medianBlur(img, 5)  # 5x5窗口

椒盐噪声是什么?就是图像上随机出现的白点和黑点。这些点的像素值要么极大,要么极小。如果用均值滤波,这些极端值会把平均值拉偏。但中值滤波不一样,它取中间值,极端值根本影响不到结果。

我记得有一次做文档扫描项目,图片上有大量椒盐噪声。用高斯滤波处理了半天,效果都不理想。换成中值滤波后,噪声瞬间消失,文字边缘还保持得很清晰。那一刻,我真觉得中值滤波是神器。

适用场景:中值滤波特别适合处理椒盐噪声、斑点噪声。但它对高斯噪声的效果一般,而且计算量比均值滤波大。

4.5 双边滤波

双边滤波是这四种方法里最「聪明」的。它同时考虑了两个因素:空间距离和像素值差异。说白了,它只对「长得像」的邻居进行平均。

# 双边滤波
bilateral = cv2.bilateralFilter(img, 9, 75, 75)  # 窗口9,颜色sigma=75,空间sigma=75

双边滤波的厉害之处在于:它能去噪,同时保留边缘。为什么?因为边缘两侧的像素值差异很大,双边滤波会认为它们「不是一类人」,所以不会互相影响。

我在做人脸美化项目时,就用了双边滤波。它能把皮肤上的小瑕疵去掉,同时保留眼睛、嘴巴的轮廓。效果比高斯滤波好太多。

注意:双边滤波的计算量很大,是这四种方法里最慢的。我建议在实时性要求不高的场景下使用。如果追求速度,可以考虑用快速双边滤波的近似算法。

4.6 四种滤波方法对比

好了,四种方法都讲完了。咱们来做个对比,方便你选型。

方法 原理 去噪效果 边缘保留 速度 适用噪声
均值滤波 邻域平均 一般 高斯噪声
高斯滤波 加权平均 较好 一般 高斯噪声
中值滤波 取中值 好(椒盐) 较好 中等 椒盐噪声
双边滤波 空间+值域加权 优秀 多种噪声

我个人建议:

  • 如果只是简单去噪,用高斯滤波,速度快,效果稳定。
  • 如果图像有大量椒盐噪声,果断选中值滤波。
  • 如果需要保留边缘,比如人脸、文字,用双边滤波。
  • 均值滤波?嗯,我基本不用了。除非是教学演示,或者对速度要求极高。

4.7 实战建议

最后,给你几个实战中的小建议:

  1. 先小后大:滤波窗口从3x3开始试,不行再加大。窗口越大,模糊越严重。
  2. 组合使用:有时候一种滤波不够,可以先用中值滤波去椒盐噪声,再用高斯滤波平滑一下。
  3. 观察效果:不要只看数值指标,要肉眼观察。有些噪声在数值上被去掉了,但图像看起来反而更假。
  4. 考虑实时性:如果是视频处理,双边滤波可能扛不住。这时候可以考虑用高斯滤波+边缘检测的替代方案。

好了,这一讲就到这里。滤波是图像预处理的基础,但也是很多问题的根源。我见过太多同学在滤波上栽跟头,希望今天的分享能帮你少走弯路。下一讲,咱们聊聊更高级的滤波方法——导向滤波和自适应滤波。

课后练习:找一张带噪声的图片,分别用四种滤波方法处理,对比效果。重点关注边缘区域的保留情况。