用Python求一幅图的频域图,相位谱图,功率谱图
时间: 2024-05-12 14:20:13 浏览: 117
这里给出Python中使用numpy和matplotlib库绘制一幅图的频域图、相位谱图和功率谱图的示例代码。
假设我们有一张名为“lena.png”的图像,首先需要将其读入并转换为灰度图,代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
# 读入图像并转换为灰度图
img = Image.open('lena.png').convert('L')
img_arr = np.asarray(img)
```
接着,可以使用numpy的fft函数计算图像的傅里叶变换,代码如下:
```python
# 计算傅里叶变换,并取其绝对值
fft_img = np.fft.fft2(img_arr)
fft_img_abs = np.abs(fft_img)
```
其中,fft_img_abs即为图像的频域图。可以使用matplotlib库中的imshow函数将其可视化:
```python
# 绘制频域图
plt.imshow(np.log(fft_img_abs), cmap='gray')
plt.title('Frequency Domain')
plt.show()
```
这里使用np.log对频域图进行对数变换,以便更好地展示其细节。
接下来,可以计算图像的相位谱,代码如下:
```python
# 计算相位谱,并取其绝对值
phase_spectrum = np.angle(fft_img)
phase_spectrum_abs = np.abs(phase_spectrum)
```
其中,phase_spectrum_abs即为图像的相位谱。同样可以使用imshow函数进行可视化:
```python
# 绘制相位谱
plt.imshow(phase_spectrum_abs, cmap='gray')
plt.title('Phase Spectrum')
plt.show()
```
最后,可以计算图像的功率谱,并进行可视化:
```python
# 计算功率谱
power_spectrum = np.abs(fft_img)**2 / len(fft_img)
power_spectrum[0, 0] = 0 # 去除直流分量
# 绘制功率谱
plt.imshow(np.log(power_spectrum), cmap='gray')
plt.title('Power Spectrum')
plt.show()
```
其中,去除直流分量是为了更好地展示功率谱的细节。同样使用np.log对功率谱进行对数变换。
完整代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
# 读入图像并转换为灰度图
img = Image.open('lena.png').convert('L')
img_arr = np.asarray(img)
# 计算傅里叶变换,并取其绝对值
fft_img = np.fft.fft2(img_arr)
fft_img_abs = np.abs(fft_img)
# 绘制频域图
plt.imshow(np.log(fft_img_abs), cmap='gray')
plt.title('Frequency Domain')
plt.show()
# 计算相位谱,并取其绝对值
phase_spectrum = np.angle(fft_img)
phase_spectrum_abs = np.abs(phase_spectrum)
# 绘制相位谱
plt.imshow(phase_spectrum_abs, cmap='gray')
plt.title('Phase Spectrum')
plt.show()
# 计算功率谱
power_spectrum = np.abs(fft_img)**2 / len(fft_img)
power_spectrum[0, 0] = 0 # 去除直流分量
# 绘制功率谱
plt.imshow(np.log(power_spectrum), cmap='gray')
plt.title('Power Spectrum')
plt.show()
```
阅读全文