OpenCV-Python使用cv2实现傅里叶变换
本文介绍如何在OpenCV-Python中使用cv2.dft和cv2.idft函数实现傅里叶变换与逆傅里叶变换。详细讲解图像转换为np.float32格式、使用np.fft.fftshift调整频谱中心、通过cv2.magnitude计算幅度谱,以及利用对数变换将幅度映射到[0,255]灰度空间进行可视化显示。
前言
在前一篇博文中,我们深入解析了傅里叶变换的原理,并演示了如何使用Numpy库完成变换。实际上,OpenCV提供了直接执行傅里叶变换的专用函数,使得操作更为便捷。
在OpenCV中,主要使用cv2.dft()函数执行傅里叶变换,利用cv2.idft()函数执行逆傅里叶变换。这两个函数的具体定义如下:
cv2.dft(原始图像,转换标识)
输入的原始图像必须转换为np.float32格式,因此需先调用cv2.float32()进行类型转换。转换标识通常设置为cv2.DFT_COMPLEX_OUTPUT,该设置确保输出结果为复数数组。
经过cv2.dft()处理后的结果包含原始图像的频谱信息。与使用Numpy库实现的情况相同,此时零频率分量并未位于图像中心,因此仍需借助numpy.fft.fftshift()函数将其移至中心位置,以便观察。
需要特别注意,cv2.dft()的返回值包含两个通道:第一个通道对应结果的实部,第二个通道对应虚部。经过numpy.fft.fftshift()处理后的频谱图像仍由实部和虚部组成,若要直观显示频谱,必须使用另一个函数cv2.magnitude()来计算幅度。
该函数的定义如下:
cv2.magnitude(参数1,参数2)
参数1为浮点型x坐标值,代表实部数据。
参数2为浮点型y坐标值,代表虚部数据,且其尺寸必须与参数1保持一致。
获取频谱图像的幅度后,还需将幅度值映射至灰度空间[0,255]范围内,以便以灰度图像形式展示。与前篇博文保持一致,这里采用公式20*np.log(cv2.magnitude())进行对数变换处理。
实现傅里叶变换
接下来,我们将利用上述OpenCV函数具体实现傅里叶变换,并展示相应的频谱信息。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("4.jpg", 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(result, cmap="gray")
plt.axis('off')
plt.show()
运行代码后,显示效果与前篇博文中的结果完全一致。

实现逆傅里叶变换
与上篇博文类似,此处我们对图像频谱进行滤波处理,具体操作为过滤掉低频信息。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("4.jpg", 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))
rows,cols=img.shape
rows_half,cols_half=int(rows/2),int(cols/2)
mask=np.zeros((rows,cols,2),dtype=np.uint8)
mask[rows_half-30:rows_half+30,cols_half-30:cols_half+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.axis('off')
plt.subplot(122)
plt.imshow(iimg, cmap="gray")
plt.axis('off')
plt.show()
运行代码后的效果如下所示:

从结果可以看出,在过滤低频信息后,图像的边缘细节信息被显著削弱。
至此,关于OpenCV-Python使用cv2实现傅里叶变换的介绍已结束。如需了解更多OpenCV傅里叶变换相关内容,欢迎搜索本站历史文章或继续阅读后续文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













