📜  python open cv中的傅里叶变换 - Python(1)

📅  最后修改于: 2023-12-03 15:34:02.941000             🧑  作者: Mango

Python OpenCV 中的傅里叶变换

简介

傅里叶变换是一种将时间域信号转换为频域信号的数学变换方法,被广泛应用于信号处理、图像处理等领域。在OpenCV中,我们可以使用numpy和cv2中的函数来实现傅里叶变换。

实现
导入库

在使用OpenCV中的傅里叶变换之前,需要导入numpy和cv2库。

import cv2
import numpy as np
读取图像

在进行傅里叶变换之前,我们需要读取一张图像。

img = cv2.imread('image.png', 0)
进行傅里叶变换

我们可以使用numpy中的fft2函数来对图像进行傅里叶变换。此函数返回一个复数数组,其中每个元素的实部和虚部分别代表频域信号的幅度和相位。

f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
绘制频域图像

我们可以使用cv2库中的magnitude函数将频域信号的幅度转换为可视化的图像。图像的中心点是频率为0的值,我们可以使用fftshift函数将其移到图像的中心,方便我们查看。

magnitude_spectrum = 20 * np.log(np.abs(fshift))

rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2)

plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])

plt.show()
进行反转傅里叶变换

我们可以使用numpy库中的ifft2函数将频域信号进行反转傅里叶变换,将其转换回时间域信号。

f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.real(img_back)
展示结果

我们可以将原始图像、频域图像和反转傅里叶变换后的图像进行对比展示。

plt.subplot(131), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(img_back, cmap='gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])

plt.show()
结论

利用OpenCV中的傅里叶变换可以将时间域信号转换为频域信号,并将其可视化成图像。通过反转傅里叶变换,我们可以将频域信号转换回时间域信号。这一过程对于图像处理中的滤波、去噪等操作有重要的应用。