凌顺
凌顺

目录

OpenCV Python 从图像的频域中应用滤波器

本示例使用的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()

file

程序说明

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