《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05
第14章 傅里叶变换
14.3 OpenCV实现傅里叶变换
OpenCV提供了函数cv2.dft()和cv2.idft()来实现傅里叶变换和逆傅里叶变换.
14.3.1 实现傅里叶变换
函数cv2.dft()的语法格式为:返回结果=cv2.dft(原始图像,转换标识)
函数cv2.dft()返回的值是双通道的,第1个通道是结果的实数部分,第2个通道是结果的虚数部分。
14.3.2 实现逆傅里叶变换
在OpenCV中,使用函数cv2.idft()实现逆傅里叶变换,该函数是傅里叶变换函数cv2.dft()的逆函数。
14.3.3 低通滤波示例
前面讲过,在一幅图像内,低频信号对应图像内变化缓慢的灰度分量。例如,在一幅大草原的图像中,低频信号对应着颜色趋于一致的广袤草原。低通滤波器让高频信号衰减而让低频信号通过,图像进行低通滤波后会变模糊。
【例14.6】使用函数cv2.dft()对图像进行傅里叶变换,得到其频谱图像。
然后,在频域内将其高频分量的值处理为0,实现低通滤波。
最后,对图像进行逆傅里叶变换,得到恢复的原始图像。
观察傅里叶变换前后图像的差异。
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('image\\lena.bmp',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
mask = np.zeros((rows,cols,2),np.uint8)
#两个通道,与频谱图像匹配
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
fShift = dftShift*mask
ishift = np.fft.ifftshift(fShift)
iImg = cv2.idft(ishift)
iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'), plt.axis('off')
plt.subplot(122),plt.imshow(iImg, cmap = 'gray')
plt.title('result'), plt.axis('off')
plt.show()
图14-19 傅里叶变换前后的对比图
运行上述代码,得到如图14-19所示的结果,左图为原始图像,右图为变换后的图像。可以看到,经过低通滤波后,图像的边缘信息被削弱了。
网友评论