在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()