读取图像train.bmp,对其分别运用Numpy实现傅里叶变换及傅里叶逆变换,运用OpenCV实现傅里叶变换及傅里叶逆变换,并显示结果图像。python代码
时间: 2024-10-06 18:06:54 浏览: 48
首先,你需要安装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`),所以没有包括在上述代码中。
阅读全文