【opencv】(3) 图像滤波:均值、方框、中值、高斯

内容有: 均值滤波 cv2.blur(),方框滤波 cv2.boxFilter(),高斯滤波 cv2.GaussianBlur(),中值滤波 cv2.medianBlur()


滤波可理解为,平均卷积操作。对于图像上存在的噪声点,通过滤波平滑处理操作,可以去除噪声点。在开始前我们先导入需要用的库文件,获取需要用到的图片。

import cv2
# 指定图像所在文件夹位置
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\opencv\\img'
# 获取文件夹中某张图像
img = cv2.imread(filepath+'\\lina.jpg')
# 显示图像
cv2.imshow('img',img) # (自定义窗口名,图象变量)
cv2.waitKey(0) # 图像不会自动消失
cv2.destoryAllWindows() # 按下任意键图像消失

1. 均值滤波

原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;对卷积核内的所有像素值求平均,将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。

方法:cv2.blur(img, ksize)

img表示图像变量;ksize表示卷积核大小(n,n),卷积核是值全为1的矩阵

#(1)均值滤波
# 参数:输入的图像数据,卷积核大小,即滑窗的宽和高,一般用奇数
blur = cv2.blur(img,(3,3))
# 显示图像
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destoryAllWindows()

【opencv】(3) 图像滤波:均值、方框、中值、高斯_第1张图片  【opencv】(3) 图像滤波:均值、方框、中值、高斯_第2张图片


2. 方框滤波

原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;方框滤波有2种方法(1)将卷积核内所有像素值相加,超过255的像素值变成255(2)对卷积核内的所有像素值求平均将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。

如果方框滤波使用第2种方法得到的结果和均值滤波的结果一样。

滤波函数: cv2.boxFilter(img, -1, ksize, normalize)

img代表输入图像;-1代表得到的结果在颜色通道上是一致的,一般不用改;ksize代表卷积核大小;normalize代表是否归一化,如果为True,得到的结果同均值滤波。

#(2)方框滤波
# 卷积核3*3
box = cv2.boxFilter(img,-1,(3,3),normalize=True)
# 显示图像
cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destoryAllWindows()

下图左侧是normalize=False的图像,右侧是normalize=True的图像

【opencv】(3) 图像滤波:均值、方框、中值、高斯_第3张图片  【opencv】(3) 图像滤波:均值、方框、中值、高斯_第4张图片


3. 高斯滤波

原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;卷积核内的权重值服从高斯分布,离中心点越近的点权值越大。将卷积核内各值与相应像素值做内积,将乘积相加后求平均,将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。

滤波方法: cv2.GaussianBlur(img, ksize, 标准差x, 标准差y)

img代表输入图像;ksize卷积核大小,滑窗宽度高度为奇数;标准差x代表沿x方向的卷积核的标准差;标准差y代表沿y方向的卷积核的标准差,不设置的话则和x轴的标准差一致

# 输入图像,卷积核大小,沿x轴方向的标准差=1,沿y轴标准差不设置的话和沿x轴一样
aussian = cv2.GaussianBlur(img, (5,5), 1)
# 显示图像
cv2.imshow('aussian',aussian)
cv2.waitKey(0)
cv2.destoryAllWindows()

下图左侧为原图,右侧为高斯滤波后的图

【opencv】(3) 图像滤波:均值、方框、中值、高斯_第5张图片  【opencv】(3) 图像滤波:均值、方框、中值、高斯_第6张图片


4. 中值滤波

原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;被卷积核框住的像素值从小到大排序,取中间大小的像素值代替滑窗中最中间的值。将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。

滤波方法: cv2.medianBlur(img, ksize)

img代表输入的图像,ksize代表滤波模板的尺寸大小,填一个数值,必须是大于1的奇数

#(4)中值滤波
median = cv2.medianBlur(img,5) # 用5*5的卷积核去做滑窗,排序后,取中间那个值
# 显示图像
cv2.imshow('median',median)
cv2.waitKey(0)
cv2.destoryAllWindows()

下图左侧为原图,右侧为滤波后的图像。可以看出,中值滤波对处理椒盐噪声具有很好的效果。

【opencv】(3) 图像滤波:均值、方框、中值、高斯_第7张图片  【opencv】(3) 图像滤波:均值、方框、中值、高斯_第8张图片


最后我们来把这三种滤波(均值、高斯、中值)图像放在一起看一下

#(5)一个窗口显示多个图像
# np.hstack()表示沿着横向堆叠
# np.vstack()表示沿着纵向堆叠
# 参数应该为一个元组
import numpy as np
res = np.hstack((blur,aussian,median))
# 图像显示
cv2.imshow('result',res)
cv2.waitKey(0)
cv2.destoryAllWindows()

【opencv】(3) 图像滤波:均值、方框、中值、高斯_第9张图片

你可能感兴趣的:(opencv机器视觉,python,人工智能,opencv,计算机视觉,图像处理)