import numpy as np
import skimage
import matplotlib.pyplot as plt
import cv2
# 读取图像
image =np.load('FBP算法实现重建.npy')
# 二维傅里叶变换
f_image = np.fft.fft2(image) # 傅里叶变化后的矩阵,元素为复数
# 直流低频部分shift到中间
fshift = np.fft.fftshift(f_image) # 使用np.abs()计算复数长度(振幅),便于画图显示。
# 掩膜-中心为0-高通滤波
rows,cols = image.shape
mask = np.ones(image.shape)
mask[int(rows/2-190):int(rows/2+190), int(cols/2-190):int(cols/2+190)] = 0
# # 掩膜-中心为1-低通滤波
# rows,cols = image.shape
# mask = np.zeros(image.shape)
# mask[int(rows/2-90):int(rows/2+90), int(cols/2-90):int(cols/2+90)] = 1
# 掩膜运算
fshift_mask = fshift*mask
# 二维傅里叶反变换
f_image_mask = np.fft.ifftshift(fshift_mask)
image_new = np.fft.ifft2(f_image_mask) # 反变换的结果是复数
image_new = np.abs(image_new)
# 画图:np.log(1+np.abs(fshift)
plt.subplot(2,2,1);plt.imshow(image, cmap='gray') # 原图
plt.subplot(2,2,2);plt.imshow(np.log(1+np.abs(fshift)), cmap='gray') # 傅里叶变化 & shift # np.log(1+灰度) 避免取log(0)的情况。
plt.subplot(2,2,3);plt.imshow(np.log(1+np.abs(fshift_mask)), cmap='gray') # 掩膜
plt.subplot(2,2,4);plt.imshow(image_new, cmap='gray') # 滤波处理后的图
plt.show()
参考来源:
Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换)
python 简单图像处理(15) 图像的傅立叶变换