OpenCV-Python使用cv2实现傅里叶变换

洛溪
洛溪
发布时间:2026-10-14| 4人浏览过
原创

本文介绍如何在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傅里叶变换相关内容,欢迎搜索本站历史文章或继续阅读后续文章,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。