数字图像处理 第四章部分源代码

图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

 运行结果:

 

结论:

要想的到和空间与相同的结果,需要在频率域进行填充

 

posted @ 2020-08-24 09:02  潜心_修炼  阅读(302)  评论(0编辑  收藏  举报