OPENCV学习笔记-利用快速傅里叶变换实现高通滤波

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()

代码逻辑

OPENCV学习笔记-利用快速傅里叶变换实现高通滤波_第1张图片

结果

OPENCV学习笔记-利用快速傅里叶变换实现高通滤波_第2张图片

你可能感兴趣的:(OPENCV)