本次实验的目标主要是为了为了学会使用傅里叶变换将图像由空间域变到频率域,并设计和使用理想低通滤波器、理想高通滤波器和巴特沃斯低通滤波器来对图像在频域范围进行处理,而后进行逆傅里叶变换,最终得到空间域里被滤波器处理过的图像。
本次实验主要完成了使用python语言读取图像并对其进行傅里叶变换、频谱平移,设计了理想低通、高通滤波器和巴特沃斯低通滤器并对频谱图像进行滤波处理,而后进行了逆频谱平移和逆傅里叶变换得到了空间域中被不同滤波器处理过后的图像,同时进行改变截止频率大小的操作来观察不同截止频率对图像滤波效果的影响。
代码:
import cv2 import numpy as np import matplotlib.pyplot as plt import math def main(): grayimg = cv2.imread('camera.png', cv2.IMREAD_GRAYSCALE) #原始图像显示在画布的一号位 plt.subplot(331), plt.imshow(grayimg, cmap='gray'), plt.title('original img'), plt.axis('off') #转换数据类型 grayimg = np.float64(grayimg / 255.0) #进行傅里叶变化 f = np.fft.fft2(grayimg) magnitude_spectrum1 = np.log(np.abs(f) + 1) #显示傅里叶变换后的平移前的频谱图像 plt.subplot(332), plt.imshow(magnitude_spectrum1, cmap='gray'), plt.title('FFT before shift'),plt.axis('off') #进行频谱平移 fshift = np.fft.fftshift(f) magnitude_spectrum2 = np.log(np.abs(fshift) + 1) # 显示傅里叶变换后的平移后的频谱图像 plt.subplot(333), plt.imshow(magnitude_spectrum2, cmap='gray'), plt.title('FFT after shift'),plt.axis('off') # 找到中心位置 rows, cols = grayimg.shape crow, ccol = int(rows / 2), int(cols / 2) # 理想低通滤波器 # 设计截止频率 D0 = 100 #返回一个给定形状和类型的用0填充的数组 mask = np.zeros((rows, cols), np.float32) #遍历元素 for i in range(rows): for j in range(cols): if (i - crow) ** 2 + (j - ccol) ** 2 <= D0 ** 2: mask[i, j] = 1.0#低频部分赋值为1 # 理想高通滤波器 #设计截止频率 D1 = 100 #返回一个给定形状和类型的用1填充的数组 mask2 = np.ones((rows, cols), np.float32) #遍历元素 for i in range(rows): for j in range(cols): if (i - crow) ** 2 + (j - ccol) ** 2 <= D1 ** 2: mask2[i, j] = 0.0#低频部分赋值为0 #巴特沃斯低通滤波器 #设计截止频率 D2=100 #设计巴特沃斯低通滤波器阶数 n=2 #返回一个给定形状和类型的用1填充的数组 mask3=np.ones((rows,cols),np.float32) #遍历元素 for i in range(rows): for j in range(cols): mask3[i,j]=1/(1+(math.sqrt((i-crow)**2+(j-ccol)**2)/D2)**(2*n))#赋值 #用理想低通滤波器掩膜与频谱图像相乘实现低通滤波 m_fshift = fshift * mask #用理想高通滤波器掩膜与频谱图像相乘实现高通滤波 m_fshift2 = fshift * mask2 #用巴特沃斯低通滤波器掩膜与频谱图像相乘实现巴特沃斯低通滤波 m_fshift3 = fshift * mask3 #分别对三幅处理后的频谱图进行逆频谱平移 ishift = np.fft.ifftshift(m_fshift) ishift2 = np.fft.ifftshift(m_fshift2) ishift3 = np.fft.ifftshift(m_fshift3) #分别对三幅频谱图进行逆傅里叶变换 iimg = np.fft.ifft2(ishift) iimg2 = np.fft.ifft2(ishift2) iimg3 = np.fft.ifft2(ishift3) #使用 np.abs ()函数取逆变换后复数的模构成灰度图像 iimg = np.abs(iimg) iimg2 = np.abs(iimg2) iimg3 = np.abs(iimg3) #显示三个掩膜和它们处理后的图像 plt.subplot(334), plt.imshow(mask, cmap='gray'), plt.title('low pass filter'), plt.axis('off') plt.subplot(337), plt.imshow(iimg, cmap='gray'), plt.title('low pass filterd image'), plt.axis('off') plt.subplot(335), plt.imshow(mask2, cmap='gray'), plt.title('high pass filter'), plt.axis('off') plt.subplot(338), plt.imshow(iimg2, cmap='gray'), plt.title('high pass filterd image'), plt.axis('off') plt.subplot(336), plt.imshow(mask3, cmap='gray'), plt.title('butterworth filter'), plt.axis('off') plt.subplot(339), plt.imshow(iimg3, cmap='gray'), plt.title('butterworth filterd image'), plt.axis('off') plt.show() if __name__ == '__main__': main()
观察并分析不同滤波器、不同截止频率对图像滤波效果的影响。
理想低通滤波器允许低频成分通过,而抑制高频成分,故其能去除图像中的噪声,实现图像平滑操作,但同时也不可避免地会引起图像模糊;
理想高通滤波器与低通滤波器相反,它允许高频成分通过,而抑制低频成分,故其能强化图像中目标的边缘,实现图像锐化操作,但同时也会不可避免地强化图像中的噪声;
理想低通滤波器因变换函数具有陡峭的变化,便会使得输出图像在灰度剧烈变化处产生振荡,即“振铃”;而使用巴特沃斯低通滤波器可以较好地抑制“振铃”现象。
对于低通滤波来讲,截止频率变大,会使得滤除的能量越来越少,平滑的效果会减弱,但同时模糊现象也会越来越轻;对于高通滤波来讲,截止频率变大,会使得滤除的能量越来越多,锐化的效果会增强。
实验分析与日志