高通滤波、低通滤波、带通滤波 python实现
创作不易,如果此文使您有收获,记得点赞哦!
一. 傅里叶变化原理:
https://www.cnblogs.com/wojianxin/p/12529809.html
二. 高通滤波、低通滤波、带通滤波:
高通滤波:高频信息通过,低频信息被阻挡;
低通滤波:低频信息通过,高频信息被阻挡;
带通滤波:介于低频和高频之间的一带信息通过,其它信息被阻挡。
三. python实现高通滤波实验:
1 # Writer : wojianxinygcl@163.com 2 3 # Data : 2020.3.20 4 5 import cv2 6 7 import numpy as np 8 9 from matplotlib import pyplot as plt 10 11 #读取图像 12 13 img = cv2.imread(\'../paojie_g.jpg\', 0) 14 15 #傅里叶变换 16 17 dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT) 18 19 fshift = np.fft.fftshift(dft) 20 21 #设置高通滤波器 22 23 rows, cols = img.shape 24 25 crow,ccol = int(rows/2), int(cols/2) #中心位置 26 27 mask = np.ones((rows, cols, 2), np.uint8) 28 29 mask[crow-30:crow+30, ccol-30:ccol+30] = 0 30 31 #掩膜图像和频谱图像乘积 32 33 f = fshift * mask 34 35 #傅里叶逆变换 36 37 ishift = np.fft.ifftshift(f) 38 39 iimg = cv2.idft(ishift) 40 41 res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1]) 42 43 #显示原始图像和高通滤波处理图像 44 45 plt.subplot(121), plt.imshow(img, \'gray\'), plt.title(\'Original Image\') 46 47 plt.axis(\'off\') 48 49 plt.subplot(122), plt.imshow(res, \'gray\'), plt.title(\'High Pass Filter Image\') 50 51 plt.axis(\'off\') 52 53 plt.show()
四. 高通滤波实验结果:
五. python实现低通滤波实验:
1 # Writer : wojianxinygcl@163.com 2 3 # Data : 2020.3.20 4 5 import cv2 6 7 import numpy as np 8 9 from matplotlib import pyplot as plt 10 11 #读取图像 12 13 img = cv2.imread(\'../paojie_g.jpg\', 0) 14 15 #傅里叶变换 16 17 dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT) 18 19 fshift = np.fft.fftshift(dft) 20 21 #设置低通滤波器 22 23 rows, cols = img.shape 24 25 crow,ccol = int(rows/2), int(cols/2) #中心位置 26 27 mask = np.zeros((rows, cols, 2), np.uint8) 28 29 mask[crow-30:crow+30, ccol-30:ccol+30] = 1 30 31 #掩膜图像和频谱图像乘积 32 33 f = fshift * mask 34 35 #傅里叶逆变换 36 37 ishift = np.fft.ifftshift(f) 38 39 iimg = cv2.idft(ishift) 40 41 res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1]) 42 43 #显示原始图像和低通滤波处理图像 44 45 plt.subplot(121), plt.imshow(img, \'gray\'), plt.title(\'Original Image\') 46 47 plt.axis(\'off\') 48 49 plt.subplot(122), plt.imshow(res, \'gray\'), plt.title(\'Low Pass Filter Image\') 50 51 plt.axis(\'off\') 52 53 plt.show()
六. 低通滤波实验结果:
七. python实现带通滤波实验:
1 # Writer : wojianxinygcl@163.com 2 3 # Data : 2020.3.20 4 5 import cv2 6 7 import numpy as np 8 9 import math 10 11 from matplotlib import pyplot as plt 12 13 #读取图像 14 15 img = cv2.imread(\'../paojie_g.jpg\', 0) 16 17 #傅里叶变换 18 19 dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT) 20 21 fshift = np.fft.fftshift(dft) 22 23 #设置带通滤波器 24 25 # w 带宽 26 27 # radius: 带中心到频率平面原点的距离 28 29 rows, cols = img.shape 30 31 crow,ccol = int(rows/2), int(cols/2) #中心位置 32 33 w = 30 34 35 radius = 30 36 37 mask = np.ones((rows, cols, 2), np.uint8) 38 39 for i in range(0, rows): 40 41 for j in range(0, cols): 42 43 # 计算(i, j)到中心点的距离 44 45 d = math.sqrt(pow(i - crow, 2) + pow(j - ccol, 2)) 46 47 if radius - w / 2 < d < radius + w / 2: 48 49 mask[i, j, 0] = mask[i, j, 1] = 0 50 51 else: 52 53 mask[i, j, 0] = mask[i, j, 1] = 1 54 55 #掩膜图像和频谱图像乘积 56 57 f = fshift * mask 58 59 #傅里叶逆变换 60 61 ishift = np.fft.ifftshift(f) 62 63 iimg = cv2.idft(ishift) 64 65 res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1]) 66 67 #显示原始图像和带通滤波处理图像 68 69 plt.subplot(121), plt.imshow(img, \'gray\'), plt.title(\'Original Image\') 70 71 plt.axis(\'off\') 72 73 plt.subplot(122), plt.imshow(res, \'gray\'), plt.title(\'Band Pass Filter Image\') 74 75 plt.axis(\'off\') 76 77 plt.show()
八. 带通滤波实验结果:
九. 总结:
高通滤波,通过了高频信息,提取了图像边缘和噪声;低通滤波,通过了低频信息,保留了图像背景和基本内容,图像边缘被阻挡,图像变模糊;带通滤波,阻挡了部分特别高频信息和特别低频信息,相对高通滤波来讲,提取的图像边缘减少,相对低通滤波来讲,保留的图像内容也减少。
十. 参考内容:
https://www.jianshu.com/p/28b03ea8592b
十一. 版权声明:
未经作者允许,请勿随意转载抄袭,抄袭情节严重者,作者将考虑追究其法律责任,创作不易,感谢您的理解和配合!