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 实战建议
最后,给你几个实战中的小建议:
- 先小后大:滤波窗口从3x3开始试,不行再加大。窗口越大,模糊越严重。
- 组合使用:有时候一种滤波不够,可以先用中值滤波去椒盐噪声,再用高斯滤波平滑一下。
- 观察效果:不要只看数值指标,要肉眼观察。有些噪声在数值上被去掉了,但图像看起来反而更假。
- 考虑实时性:如果是视频处理,双边滤波可能扛不住。这时候可以考虑用高斯滤波+边缘检测的替代方案。
好了,这一讲就到这里。滤波是图像预处理的基础,但也是很多问题的根源。我见过太多同学在滤波上栽跟头,希望今天的分享能帮你少走弯路。下一讲,咱们聊聊更高级的滤波方法——导向滤波和自适应滤波。
课后练习:找一张带噪声的图片,分别用四种滤波方法处理,对比效果。重点关注边缘区域的保留情况。