由于编程语言选择Python,所以博主用的编译器为PyCharm 2017
岗萨勒斯第三版的数字图像处理中,介绍到空间滤波器模板,为了实现任意模板的滤波,例如3×3或5×5的均值滤波和3×3或5×5的高斯滤波,以及任意数值的空间滤波模板,用python语言在PyCharm中编写了如下代码。
此次例中中采用的是5×5,sigma=1.4的高斯滤波模板,模板设置如下:
代码如下
import cv2
from pylab import *
def GeneralFilter(Image,a): #输入图像Image,模板a
im=array(Image)
dim=math.sqrt(len(a)) # 模板的维度dim
w=im.shape[0] # 计算输入图像的宽高
h=im.shape[1]
b=[] # 待处理的与模板等大小的图像块,分BGR通道
g=[]
r=[]
for i in range(int(dim/2),w-int(dim/2)):
for j in range(int(dim/2),h-int(dim/2)):
for m in range(-int(dim/2),-int(dim/2)+int(dim)):
for n in range(-int(dim / 2), -int(dim / 2) + int(dim)):
b.append(im[i+m,j+n,0])
g.append(im[i+m,j+n,1])
r.append(im[i+m,j+n,2])
im[i,j,0]=sum(np.multiply(np.array(a),np.array(b)))/sum(a)
im[i, j, 1] =sum(np.multiply(np.array(a),np.array(g)))/sum(a)
im[i, j, 2] =sum(np.multiply(np.array(a),np.array(r)))/sum(a)
b=[];g=[];r=[]
return im
img=cv2.imread('Gauss.jpg')
a=[2,4,5,4,2,4,9,12,9,4,5,12,15,12,5,4,9,12,9,4,2,4,5,4,2]
im=GeneralFilter(img,a)
cv2.imshow('Origin',img)
cv2.imshow('GaussFilter',im)
cv2.waitKey()
cv2.destroyAllWindows()
高斯滤波对于被高斯噪声污染的图像有比较好的处理效果,而该模板同样可以设计成Sobel算子模板和其他的模板,具有很好的通用性,值得学习。