python实现图像的频域滤波_OpenCV Python 从图像的频域中应用滤波器

By 凌顺

2019年9月24日

本示例使用的OpenCV版本是:OpenCV 4.1.1

运行Python的编辑器:Jupyter notebook 6.0.0

实现目的

本教程,主要学会如何在图像的频域中应用滤波器

实现代码

1,加载需要的库,灰度加载图片和显示图像

import cv2

import numpy as np

import matplotlib.pyplot as plt

img = cv2.imread('dog.png',0).astype(np.float32) / 255

plt.imshow(img, cmap='gray')

2,利用离散傅里叶变换 cv2.dft 将图像从空间域转换为频域

fft = cv2.dft(img, flags=cv2.DFT_COMPLEX_OUTPUT)

3,移动FFT的返回使低频率位于阵列的中心

fft_shift = np.fft.fftshift(fft, axes=[0, 1])

4,将高频振幅设置为零,其他频率保持不变

sz = 25

mask = np.zeros(fft_shift.shape, np.uint8)

mask[mask.shape[0]//2-sz:mask.shape[0]//2+sz,

mask.shape[1]//2-sz:mask.shape[1]//2+sz, :] = 1

fft_shift *= mask

5,将DFT结果移回

fft = np.fft.ifftshift(fft_shift, axes=[0, 1])

6,使用逆离散傅里叶逆变换方法 cv2.idft 将滤波后的图像从频域转换回空间域:

filtered = cv2.idft(fft, flags=cv2.DFT_SCALE | cv2.DFT_REAL_OUTPUT)

7,显示原图和处理后的图像进行对比

plt.figure(figsize=(10,10))

plt.subplot(121)

plt.axis('off')

plt.title('original')

plt.imshow(img, cmap='gray')

plt.subplot(122)

plt.axis('off')

plt.title('no high frequencies')

plt.imshow(filtered, cmap='gray')

plt.tight_layout()

plt.show()

程序说明

利用快速傅里叶变换,将图像从空间域转换为频域。

然后,我们创建一个除中心矩形外都为零的掩码。使用该掩码,我们将高频振幅设置为零,最后将图像转换回空间显示。

你可能感兴趣的:(python实现图像的频域滤波)