傅里叶变换及逆傅里叶变换的Python代码
时间: 2023-11-28 21:41:48 浏览: 88
傅里叶变换和逆傅里叶变换是信号处理中常用的方法,可以将信号从时域转换到频域,或者从频域转换到时域。以下是傅里叶变换和逆傅里叶变换的Python代码:
傅里叶变换:
```python
import numpy as np
def fourier_transform(signal):
N = len(signal)
n = np.arange(N)
k = n.reshape((N, 1))
M = np.exp(-2j * np.pi * k * n / N)
return np.dot(M, signal)
```
逆傅里叶变换:
```python
import numpy as np
def inverse_fourier_transform(signal):
N = len(signal)
n = np.arange(N)
k = n.reshape((N, 1))
M = np.exp(2j * np.pi * k * n / N)
return np.real(np.dot(M, signal)) / N
```
这些代码可以用于处理一维信号。如果要处理二维信号,可以使用类似的方法,只需要将信号和变换矩阵改为二维即可。
相关问题
读取图像train.bmp,对其分别运用Numpy实现傅里叶变换及傅里叶逆变换,运用OpenCV实现傅里叶变换及傅里叶逆变换,并显示结果图像。python代码
首先,你需要安装numpy、opencv-python库才能进行这样的操作。以下是使用Python和这两个库分别进行傅里叶变换和逆变换的示例:
```python
# 导入必要的库
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('train.bmp', 0) # 将图片转换为灰度图像(如果原图不是灰度)
if img is None:
print("Failed to load image.")
else:
# Numpy实现傅里叶变换
dft_numpy = np.fft.fft2(img)
magnitude_numpy = np.abs(dft_numpy)
# OpenCV实现傅里叶变换
dft_opencv = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
magnitude_opencv = 20 * np.log(cv2.magnitude(dft_opencv[:, :, 0], dft_opencv[:, :, 1]))
# 取实部和对角线后进行四舍五入处理(因为OpenCV默认的结果包含虚部)
magnitude_opencv = cv2.magnitude(dft_opencv[:, :, 0], dft_opencv[:, :dft_opencv.shape[1]//2+1, 0])
# 傅里叶逆变换
ifft_numpy = np.fft.ifft2(magnitude_numpy)
real_ifft_numpy = np.abs(ifft_numpy)
# 将结果保存为图像并显示
fig, axs = plt.subplots(2, 2, figsize=(8, 8))
axs[0, 0].imshow(img, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 1].imshow(magnitude_numpy, cmap='gray')
axs[0, 1].set_title('Magnitude (Numpy Fourier Transform)')
axs[1, 0].imshow(magnitude_opencv, cmap='gray')
axs[1, 0].set_title('Magnitude (OpenCV Fourier Transform)')
axs[1, 1].imshow(real_ifft_numpy, cmap='gray')
axs[1, 1].set_title('Real Part (Inverse Fourier Transform - Numpy)')
for ax in axs.flat:
ax.set(xticks=[], yticks=[])
plt.tight_layout()
plt.show()
# 如果在OpenCV中想要直接查看反变换后的图像,可以这样做:
# inverse_transform = cv2.idft(dft_opencv, shift=True) # 注意shift=True用于将零频率成分移动到中心
# result = cv2.magnitude(inverse_transform[:, :, 0], inverse_transform[:, :, 1])
# cv2.imshow('Inverse Fourier Transform (OpenCV)', result)
```
注意:`inverse_transform`部分通常会涉及到图像的卷积操作,这里由于OpenCV的idft函数需要特殊的处理(例如`shift=True`),所以没有包括在上述代码中。
、读取图像train.bmp,对其分别运用Numpy实现傅里叶变换及傅里叶逆变换,运用OpenCV实现傅里叶变换及傅里叶逆变换,并显示结果图像。python代码
在Python中,你可以使用NumPy库来进行数值计算,包括傅立叶变换(FFT),而OpenCV则可以方便地处理图像操作,包括傅立叶变换后的图像显示。以下是一个基本的示例,演示如何使用这两种库读取、处理和显示图像:
```python
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('train.bmp', 0) # 读取灰度图像,如果需要彩色,可以改为0
if img is None:
print("Image not found.")
else:
# Numpy的傅立叶变换
dft_numpynp = np.fft.fft2(img)
magnitude_numpynp = np.abs(dft_numpynp)
# OpenCV的傅立叶变换
dft_opencv = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft_opencv)
magnitude_opencv = np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# 傅立叶逆变换
ifft_numpynp = np.fft.ifft2(magnitude_numpynp)
ifft_opencv = cv2.idft(dft_shift)
ifft_shift = np.fft.ifftshift(ifft_opencv)
# 只保留实际部分并转换回原范围
ifft_numpynp = np.abs(ifft_numpynp)
ifft_opencv = cv2.magnitude(ifft_shift[:, :, 0], ifft_shift[:, :, 1])
# 显示原始图像和处理后的图像
fig, axs = plt.subplots(2, 2, figsize=(8, 8))
axs[0, 0].imshow(img, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 1].imshow(magnitude_numpynp, cmap='gray')
axs[0, 1].set_title('Magnitude (Numpy FFT)')
axs[1, 0].imshow(magnitude_opencv, cmap='gray')
axs[1, 0].set_title('Magnitude (OpenCV FFT)')
axs[1, 1].imshow(ifft_numpynp, cmap='gray')
axs[1, 1].set_title('Inverse FFT (Numpy)')
for ax in axs.flat:
ax.set(xticks=[], yticks=[])
plt.tight_layout()
plt.show()
阅读全文