代码语言:javascript复制
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png',0)#原始图像
dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)#傅里叶变换
dftShift=np.fft.fftshift(dft)
rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2)#计算中心位置坐标
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow 30, ccol-30:ccol 30]=1#低通滤波
fShift=dftShift*mask
ishift=np.fft.ifftshift(fShift)
iImg=cv2.idft(ishift)#逆傅里叶变换
iImg=cv2.magnitude(iImg[:,:,0],iImg[:,:,1])#幅度值调整到[0,255]灰度空间内
plt.subplot(121)
plt.imshow(img,cmap='gray')
plt.title('original')
plt.axis('off')
plt.subplot(122)
plt.imshow(iImg,cmap='gray')
plt.title('iimg')
plt.axis('off')
plt.show()
算法:低通滤波将傅里叶变换结果图像中的高频分量值都替换为0,即屏蔽高频信号,只保留低频信号,实现低通滤波。低频信号对应图像内变化缓慢的灰度分量。低通滤波器使高频信号衰减而让低频信号通过,图像进行低通滤波后会变模糊。
- 首先将图像进行傅里叶变换,得到其频谱图像
- 然后在频域内将其高频分量的值处理为0,实现低通滤波
- 最后,对图像进行逆傅里叶变换,得到恢复的原始图像
return=cv2.dft(img,flags)
- img表示输入图像
- flags表示转换标识,通常设置为cv2.DFT_COMPLEX_OUTPUT
return=cv2.magnitude(x,y)
- x表示实部
- y表示虚部