本示例使用的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()
程序说明
利用快速傅里叶变换,将图像从空间域转换为频域。
然后,我们创建一个除中心矩形外都为零的掩码。使用该掩码,我们将高频振幅设置为零,最后将图像转换回空间显示。
进一步应用
使用快速傅里叶变换更有用的实例可以参考下一篇文章《OpenCV Python 使用离散傅里叶从空间域到频域的变换》