您现在的位置是:首页 >技术教程 >day8 - 使用不同的滤波核进行图像降噪网站首页技术教程

day8 - 使用不同的滤波核进行图像降噪

九灵猴君 2024-06-22 06:01:02
简介day8 - 使用不同的滤波核进行图像降噪

本期主要介绍用于图像平滑处理的滤波,分别是方框滤波、均值滤波、中值滤波、高斯滤波,比较不同滤波的效果;并了解自定义滤波器进行图像处理。

完成本期内容,你可以:

  • 会使用方框滤波、均值滤波、中值滤波、高斯滤波进行图像处理

  • 掌握根据不同的图像选择合适的滤波器

若要运行案例代码,你需要有:

  • 操作系统: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进行降噪处理。

请添加图片描述

scenery.png
  1. code文件夹下创建sp_noise.py文件;
  2. 导入所需的库,OpenCV、datetime;
  3. 读取dataset文件夹下的sp_noise.png图片,并进行展示,标题为sp_noise ;
  4. 分别使用均值滤波、中值滤波、高斯滤波进行图像处理,并展示结果;

步骤一:创建文件并读取图像

代码实现

# 导入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 结果比较

请添加图片描述

通过三种不同滤波方法对图像进行处理,中值滤波对图像的处理耗时较短,均值滤波耗时较长;但是从滤波效果来看,中值滤波效果优于其他两者;均值滤波对于噪声的处理效果略好于高斯滤波,但是对于图像的模糊更多;从综合效果出发,对于这张图像,使用中值滤波处理的效果最好。

点击下载源码

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。