数字图像处理 第四章部分源代码
图4.32,有无填充对图像频率域滤波的影响
源代码
1 ''' 2 有无填充对高斯低通滤波结果的影响 3 ''' 4 5 import cv2 6 import numpy as np 7 import matplotlib.pyplot as plt 8 import self_def 9 10 img = cv2.imread('Fig0432.tif',0) 11 12 #按照p165的步骤填充 13 img_fill = self_def.fill(img) 14 fft = np.fft.fft2(img_fill) 15 F = np.fft.fftshift(fft)#用这一步取代变换前乘以-1^(x+y) 16 H = self_def.GLPF(img_fill,20) 17 G = H*F 18 G_ifft = np.fft.ifftshift(G) 19 g_fill = np.fft.ifft2(G_ifft) 20 g1 = self_def.ifill(g_fill) 21 g1= np.abs(g1) 22 #g1 = g1.astype(np.uint8) 23 24 #不填充 25 fft = np.fft.fft2(img) 26 F = np.fft.fftshift(fft) 27 H = self_def.GLPF(img,20) 28 G = H*F 29 G_ifft = np.fft.ifftshift(G) 30 g2= np.fft.ifft2(G_ifft) 31 g2 = np.abs(g2) 32 #g1 = g1.astype(np.uint8) 33 34 #显示图像 35 plt.subplot(121),plt.imshow(g1,cmap='gray') 36 plt.title('fill'),plt.xticks([]),plt.yticks([]) 37 plt.subplot(122),plt.imshow(g2,cmap='gray') 38 plt.title('none_fill'),plt.xticks([]),plt.yticks([]) 39 plt.show()
1 def fill(img): 2 ''' 3 图像填充函数,右侧下侧填充为0 4 :param img: 被填充图像 5 :return: 填充后的图像 6 ''' 7 import numpy as np 8 m,n = np.shape(img) 9 img_fill = np.zeros((2*m,2*n)) 10 img_fill[0:m,0:n] = img 11 return img_fill 12 13 def ifill(img_fill): 14 ''' 15 取消图像填充函数,仅保留图像左上侧四分之一 16 :param img_fill: 原图像 17 :return: 裁剪过后的图像 18 ''' 19 import numpy as np 20 p,q = np.shape(img_fill) 21 m = int(p/2) 22 n = int(q/2) 23 img = np.zeros((m,n)) 24 img = img_fill[0:m,0:n] 25 return img 26 27 def GLPF(img,D0): 28 ''' 29 高斯低通滤波器,式(4.8-7) 30 :param img: 需要滤波的图像,用于确定滤波器大小 31 :param D0: 滤波半径 32 :return: 滤波器 33 ''' 34 import numpy as np 35 m,n = np.shape(img) 36 mm = np.arange(m) 37 nn = np.arange(n) 38 u, v = np.meshgrid(mm, nn) 39 H = np.exp(-((u-m/2)**2+(v-n/2)**2)**0.5/(2*D0)) 40 41 ''' 42 以下代码为了显示滤波器的三维图像 43 from mpl_toolkits.mplot3d import Axes3D 44 from matplotlib import pyplot as plt 45 from matplotlib import cm 46 fig = plt.figure() 47 ax = fig.add_subplot(111, projection='3d') 48 ax.plot_surface(u, v, H, rstride=4, cstride=4, cmap=cm.YlGnBu_r) 49 plt.show()''' 50 return H
运行结果:
结论:
要想的到和空间与相同的结果,需要在频率域进行填充