用Python读入一幅灰度图像,添加不同类型噪声,先利用傅里叶变换转换到 频率,然后测试低通滤波,高通滤波和带通滤波,然后逆变换成图像域。对比分 析原始图像频谱图像,滤波器图像和滤波后图像的差别。
时间: 2024-05-09 15:20:42 浏览: 133
以下是Python代码实现:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读入灰度图像
img = cv2.imread('lena.jpg', 0)
# 添加高斯噪声
mean = 0
var = 100
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
noisy_img = img + gaussian.astype('uint8')
# 傅里叶变换
f = np.fft.fft2(noisy_img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
# 显示原始图像频谱
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
# 高通滤波
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
mask = np.ones((rows, cols), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0
fshift_hp = fshift * mask
magnitude_spectrum_hp = 20 * np.log(np.abs(fshift_hp))
img_back_hp = np.fft.ifft2(np.fft.ifftshift(fshift_hp)).real
# 显示高通滤波后的频谱和图像
plt.subplot(2, 2, 3), plt.imshow(magnitude_spectrum_hp, cmap='gray')
plt.title('Magnitude Spectrum (High Pass Filter)'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(img_back_hp, cmap='gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.show()
```
这段代码首先读入一幅灰度图像`lena.jpg`,然后添加高斯噪声。接着进行傅里叶变换,得到频谱图像。然后使用高通滤波器进行滤波,得到滤波后的频谱图像和图像域的图像。
我们可以根据需要修改代码,实现低通滤波和带通滤波。同时,我们也可以通过对滤波器的大小和形状进行调整,来控制滤波效果。最终,我们可以对比分析原始图像频谱图像、滤波器图像和滤波后图像的差别,以评估滤波效果。
阅读全文