理想滤波器、巴特沃斯滤波器、高斯滤波器(Python)

 1 import numpy as np
 2 import cv2
 3 import matplotlib.pyplot as plt
 4 
 5 def G(img,str,s):
 6     # 设置截止频率
 7     D0 = 8
 8     # #傅里叶变换
 9     f = np.fft.fft2(img)
10     f_shift = np.fft.fftshift(f)   # 将零频点移到频谱的中间,就是中间化处理
11     m = f_shift.shape[0]
12     n = f_shift.shape[1]
13     h1 = np.zeros((m, n))
14     x0 = np.floor(m/2)
15     y0 = np.floor(n/2)   #频谱中心
16     for i in range(m):
17         for j in range(n):
18             D = np.sqrt((i - x0)**2 + (j - y0)**2)   #计算距离
19             if(str=='hp'):   #高通
20                 if s=='ideal':   #理想滤波
21                     if (D > D0):
22                         h1[i, j] = 1
23                     else:
24                         h1[i, j] = 0
25                 if s=='Gaussian':   #高斯滤波
26                     h1[i][j] = 1-np.exp((-1)*D**2/2/(D0**2))
27                 if s=='butterworth':    #巴特沃斯滤波器
28                     h1[i][j] = 1.0 / (1 + (D0 / D) ** (2 * 2))
29             if (str == 'lp'):   #低通
30                 if s=='ideal':
31                     if (D > D0):
32                         h1[i, j] = 0
33                     else:
34                         h1[i, j] = 1
35                 if s == 'Gaussian':
36                     h1[i][j] = np.exp((-1) * D ** 2 / 2 / (D0 ** 2))
37                 if s=='butterworth':
38                     h1[i][j] = 1.0 / (1 + (D / D0) ** (2 * 2))
39     G = np.multiply(f_shift, h1)
40     new_f1 = np.fft.ifftshift(G)    # 傅里叶反变换(之前是正变换,现在该反变换变回去了)
41     result = np.uint8(np.abs(np.fft.ifft2(new_f1)))
42     return result
43 
44 img =cv2.imread('E:\A29.jpg',0)   #图像输入
45 plt.subplot(331), plt.imshow(img, 'gray'), plt.title('Original Image')
46 plt.axis('off')
47 res = G(img,'lp','ideal')
48 plt.subplot(332), plt.imshow(res, 'gray'), plt.title('ideal_lp')
49 plt.axis('off')
50 res = G(img,'hp','ideal')
51 plt.subplot(333), plt.imshow(res, 'gray'), plt.title('ideal_hp')
52 plt.axis('off')
53 res = G(img,'lp','butterworth')
54 plt.subplot(334), plt.imshow(res, 'gray'), plt.title('butterworth_lp')
55 plt.axis('off')
56 res = G(img,'hp','butterworth')
57 plt.subplot(335), plt.imshow(res, 'gray'), plt.title('butterworth_hp')
58 plt.axis('off')
59 res = G(img,'lp','Gaussian')
60 plt.subplot(336), plt.imshow(res, 'gray'), plt.title('Gaussian_lp')
61 plt.axis('off')
62 res = G(img,'hp','Gaussian')
63 plt.subplot(337), plt.imshow(res, 'gray'), plt.title('Gaussian_hp')
64 plt.axis('off')
65 plt.show()

 

posted @ 2022-05-17 17:10  能吃八碗饭  阅读(339)  评论(0)    收藏  举报