OPENCV学习笔记-利用快速傅里叶变换实现高通滤波
代码
(跟着官方教程敲的↓)
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_transforms/py_fourier_transform/py_fourier_transform.html#fourier-transform
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('leopard.jpg', 0)
f = np.fft.fft2(img)
# 频率为 0 的部分(直流分量)在输出图像的左上角
# 如果想让它(直流分量)在输出图像的中心,我们还需要将结果沿两个方向平移
fshift = np.fft.fftshift(f)
# 构建振幅图
magnitude_spectrum = 20*np.log(np.abs(fshift))
rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2)
# 将低频的信号设置为0
# 一般不使用矩阵窗口,而是使用高斯窗口
fshift[crow-100:crow+100, ccol-100:ccol+100] = 0
# 将频域偏移,转化为时域
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('input image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(img_back, cmap='gray')
plt.title('Result Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.show()
img_back_int = img_back.astype(np.int8)
cv2.imshow('JET', img_back_int)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码逻辑

结果
