本期主要介绍用于图像平滑处理的滤波,分别是方框滤波、均值滤波、中值滤波、高斯滤波,比较不同滤波的效果;并了解自定义滤波器进行图像处理。
完成本期内容,你可以:
-
会使用方框滤波、均值滤波、中值滤波、高斯滤波进行图像处理
-
掌握根据不同的图像选择合适的滤波器
若要运行案例代码,你需要有:
-
操作系统:Ubuntu 16 以上 或者 Windows10
-
工具软件:VScode 或者其他源码编辑器
-
硬件环境:无特殊要求
-
核心库:python 3.6.13, opencv-contrib-python 3.4.11.39
方框滤波
OpenCV将方框滤波器封装成了boxFilter()
方法。
函数原型: dst = cv2. boxFilter(src, ddepth,ksize, anchor, normalize,eborderType)
dst为输出图像。
参数描述如下:
参数 | 描述 |
---|---|
src | 被处理的图像 |
ddepth | 结果图像的图像深度,可以用-1表示与原始图像相同。 |
ksize | 滤波核大小,其格式为(高度,宽度),建议使用宽高相等的奇数边长 |
anchor | 可选参数,滤波核的锚点 |
normalize | 在滤波时是否进行归一化。 |
borderType | 可选参数,边界样式,建议采用默认值 |
均值滤波
OpenCV将均值滤波器封装成了cv2.blur()
方法。
函数原型: dst = cv2.blur(src, ksize, anchor, borderType)
image为输出图像。
参数描述如下:
参数 | 描述 |
---|---|
src | 被处理的图像 |
ksize | 滤波核大小,其格式为(高度,宽度),建议使用宽高相等的奇数边长 |
anchor | 可选参数,滤波核的锚点 |
borderType | 可选参数,边界样式,建议采用默认值 |
中值滤波
OpenCV将中值滤波器封装成了cv2.medianBlur()
方法。
函数原型:dst = cv2.medianBlur(src,ksize);
参数描述如下:
参数 | 描述 |
---|---|
src | 被处理的图像 |
ksize | 滤波核的边长,必须是大于1的奇数,方法会根据此边长自动创建一个正方形的滤波核。 |
高斯滤波
OpenCV将高斯滤波器封装成了cv2.GaussianBlur()
方法。
函数原型: dst = cv2.GaussianBlur( src, ksize, sigmaX[, sigmaY[, borderType]] )
dst为返回值,表示进行高斯滤波后得到的处理结果。
参数描述如下:
参数 | 描述 |
---|---|
src | 需要处理的图像,即源图像 |
ksize | 滤波核大小,其格式为(高度,宽度),建议使用宽高相等的奇数边长 |
sigmaX | 卷积核在水平方向上(X轴方向)的标准差,其控制的是权重比例。 |
sigmaY | 卷积核在垂直方向上(Y轴方向)的标准差。 |
borderType | 可选参数,边界样式,建议采用默认值 |
自定义滤波
OpenCV中提供了cv2.filter2D()
函数来实现自定义滤波器。
函数原型: dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType )
dst为输出图像。
参数描述如下:
参数 | 描述 |
---|---|
src | 被处理的图像 |
ddepth | 结果图像的图像深度,可以用-1表示与原始图像相同 |
kernel | 卷积核,是个单通道的数组 |
anchor | 可选参数,滤波核的锚点 |
delta | 可选参数,修正值 |
borderType | 可选参数,边界样式,建议采用默认值 |
具体步骤
1. 创建项目结构
创建项目名为使用不同的滤波进行图像降噪
,项目根目录下新建code
文件夹储存代码,新建dataset
文件夹储存数据,项目结构如下:
使用不同的滤波进行图像降噪 # 项目名称
├── code # 储存代码文件
├── dataset # 储存数据文件
注:如项目结构已存在,无需再创建。
2. 使用不同的滤波处理图像
将图像scenery.png
添加了噪声的图像sp_noise.png
进行降噪处理。
- 在
code
文件夹下创建sp_noise.py
文件; - 导入所需的库,OpenCV、datetime;
- 读取
dataset
文件夹下的sp_noise.png
图片,并进行展示,标题为sp_noise ; - 分别使用均值滤波、中值滤波、高斯滤波进行图像处理,并展示结果;
步骤一:创建文件并读取图像
代码实现
# 导入OpenCV、datetime
import cv2
import datetime
# 读取图像
o=cv2.imread("../dataset/sp_noise.png")
cv2.imshow("sp_noise",o)
步骤二:使用均值滤波处理图像
代码实现
# 使用 5*5的滤波核进行均值滤波处理
strat_t = datetime.datetime.now() # 获取当前时间
blur_img=cv2.blur(o,(5,5))
end_t = datetime.datetime.now()
t = end_t - strat_t #计算均值滤波处理所用时间
print('均值滤波处理耗时:',t)
cv2.imshow("blur_img",blur_img)
均值滤波处理耗时: 0:00:00.003000
步骤三:使用中值滤波处理图像
代码实现
# 使用 3*3的滤波核进行中值滤波处理
strat_t = datetime.datetime.now()
median_img=cv2.medianBlur(o,3)
end_t = datetime.datetime.now()
t = end_t - strat_t
print('中值滤波处理耗时:',t)
cv2.imshow("median_img",median_img)
中值滤波处理耗时: 0:00:00.000999
步骤四:使用高斯滤波处理图像
代码实现
# 使用 3*3标准差为0的滤波核进行高斯滤波处理
strat_t = datetime.datetime.now()
gaussian_img = cv2.GaussianBlur(o,(3,3),0,0)
end_t = datetime.datetime.now()
t = end_t - strat_t
print('高斯滤波处理耗时:',t)
cv2.imshow("gaussian_img",gaussian_img)
高斯滤波处理耗时:0:00:00.002001
步骤五:关闭窗口
代码实现
cv2.waitKey()
cv2.destroyAllWindows()
5.3 结果比较
通过三种不同滤波方法对图像进行处理,中值滤波对图像的处理耗时较短,均值滤波耗时较长;但是从滤波效果来看,中值滤波效果优于其他两者;均值滤波对于噪声的处理效果略好于高斯滤波,但是对于图像的模糊更多;从综合效果出发,对于这张图像,使用中值滤波处理的效果最好。