编写二维FFT程序,要求对一幅图像进行傅里叶变换并显示;对傅里叶变换后的图像,考察其频谱分布;将原始图像和傅里叶反变换后的图像显示在一个绘图窗口
时间: 2024-12-23 08:17:19 浏览: 8
编写一个二维快速傅立叶变换 (FFT) 程序通常涉及以下几个步骤:
1. **导入库**:首先,你需要导入一些必要的数学和图像处理库,如 NumPy、Matplotlib 和 OpenCV。
```python
import numpy as np
import cv2
import matplotlib.pyplot as plt
```
2. **读取图像**:从文件或摄像头获取图像数据,并将其转换为灰度图像,因为彩色图像的傅立叶变换需要单独处理每个颜色通道。
```python
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
```
3. **预处理**:如果图像不是正方形,可以调整大小使其变为正方形,以便于处理。
```python
height, width = img.shape
max_dim = max(height, width)
# resize if needed
img = cv2.resize(img, (max_dim, max_dim))
```
4. **进行二维 FFT**:利用 NumPy 的 `fft2` 函数进行二维傅立叶变换。
```python
fft_img = np.fft.fft2(img)
```
5. **计算幅度和角度**:对于实际应用,通常我们关心的是幅值部分(去掉虚部),并通过归一化得到频率域图像。
```python
magnitude = np.abs(fft_img)
angle = np.angle(fft_img)
```
6. **绘制频谱分布**:使用 Matplotlib 显示幅值图像,可以观察高频细节和低频成分。
```python
plt.imshow(np.log(magnitude), cmap='gray')
plt.title('Frequency Spectrum')
plt.show()
```
7. **傅里叶逆变换**:为了还原图像,使用 `ifftshift` 和 `ifft2` 进行逆变换。
```python
inverse_fft = np.fft.ifft2(np.fft.ifftshift(magnitude))
```
8. **可视化结果**:最后,将原始图像和逆变换后的图像放在一起比较。
```python
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
axs[0].imshow(img, cmap='gray')
axs[0].set_title('Original Image')
axs[1].imshow(inverse_fft.real, cmap='gray')
axs[1].set_title('Inverted Image')
for ax in axs:
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()
```
阅读全文