(2) 对“lajiao”图像采用傅里叶变换,将其分解为幅值谱、相位谱,利用幅值谱、相位谱重构图像后保存。使用python
时间: 2024-11-27 07:11:18 浏览: 16
在Python中,我们可以使用Scipy和Numpy库来进行傅立叶变换(Fourier Transform)。以下是如何对一幅图像如'lajiao'进行傅立叶变换,获取幅值谱和相位谱,并用它们重构图像的基本步骤:
1. **导入所需库**:
```python
import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
from PIL import Image
```
2. **加载和预处理图像**:
```python
img = Image.open('lajiao.png')
img = np.array(img, dtype='float64') / 255. # 将像素值归一化到0-1范围内
img_shape = img.shape
```
3. **进行傅立叶变换**:
```python
fft_img = fftpack.fft2(img)
magnitude_spectrum = 2 * np.abs(fft_img) / img_shape[::-1] # 幅值谱,除以尺寸是为了归一化
phase_spectrum = np.angle(fft_img) # 相位谱
```
4. **显示原始图像、幅值谱和相位谱**:
```python
plt.subplot(2, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.subplot(2, 2, 2)
plt.imshow(np.log(magnitude_spectrum), cmap='gray')
plt.title('Magnitude Spectrum')
plt.subplot(2, 2, 3)
plt.imshow(phase_spectrum, cmap='gray')
plt.title('Phase Spectrum')
plt.show()
```
5. **重构图像**(仅理论演示,实际过程可能会丢失细节和信息):
```python
reconstructed_img = np.abs(fftpack.ifftshift(fftpack.ifft2(magnitude_spectrum * np.exp(1j * phase_spectrum)))) * img_shape[::-1]
reconstructed_img = reconstructed_img.real.astype(np.uint8) # 回归整数范围并保存为图像
```
6. **保存重构后的图像**:
```python
Image.fromarray(reconstructed_img).save('reconstructed_lajiao.png')
```
注意,由于离散傅立叶变换(DFT)对高频成分有失真,直接重构的图像可能会失去一些细节。此外,对于相位谱重建,需要处理零填充的问题,这里的简单版本可能无法完美还原原始图像。
阅读全文