滤波可理解为,平均卷积操作。对于图像上存在的噪声点,通过滤波平滑处理操作,可以去除噪声点。在开始前我们先导入需要用的库文件,获取需要用到的图片。
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() # 按下任意键图像消失
原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;对卷积核内的所有像素值求平均,将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。
img表示图像变量;ksize表示卷积核大小(n,n),卷积核是值全为1的矩阵
#(1)均值滤波
# 参数:输入的图像数据,卷积核大小,即滑窗的宽和高,一般用奇数
blur = cv2.blur(img,(3,3))
# 显示图像
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destoryAllWindows()
原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;方框滤波有2种方法(1)将卷积核内所有像素值相加,超过255的像素值变成255;(2)对卷积核内的所有像素值求平均。将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。
如果方框滤波使用第2种方法得到的结果和均值滤波的结果一样。
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的图像
原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;卷积核内的权重值服从高斯分布,离中心点越近的点权值越大。将卷积核内各值与相应像素值做内积,将乘积相加后求平均,将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。
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()
下图左侧为原图,右侧为高斯滤波后的图
原理: 卷积核在图像上滑动,将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;被卷积核框住的像素值从小到大排序,取中间大小的像素值代替滑窗中最中间的值。将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。
img代表输入的图像,ksize代表滤波模板的尺寸大小,填一个数值,必须是大于1的奇数
#(4)中值滤波
median = cv2.medianBlur(img,5) # 用5*5的卷积核去做滑窗,排序后,取中间那个值
# 显示图像
cv2.imshow('median',median)
cv2.waitKey(0)
cv2.destoryAllWindows()
下图左侧为原图,右侧为滤波后的图像。可以看出,中值滤波对处理椒盐噪声具有很好的效果。
最后我们来把这三种滤波(均值、高斯、中值)图像放在一起看一下
#(5)一个窗口显示多个图像
# np.hstack()表示沿着横向堆叠
# np.vstack()表示沿着纵向堆叠
# 参数应该为一个元组
import numpy as np
res = np.hstack((blur,aussian,median))
# 图像显示
cv2.imshow('result',res)
cv2.waitKey(0)
cv2.destoryAllWindows()