请简单描述频域滤波的主要步骤,并举例写出一个巴特沃斯低通滤波器去除图像中高斯噪声的程序实例。
时间: 2024-02-20 13:02:24 浏览: 78
频域滤波的主要步骤如下:
1. 将原始图像进行傅里叶变换,得到其频域表示;
2. 在频域中选择一个滤波器函数,并将其应用到频域图像中,以滤除不需要的频率成分;
3. 对滤波后的频域图像进行反傅里叶变换,将其转换回空域。
巴特沃斯低通滤波器是一种常用的滤波器,可以用来去除图像中的高频噪声。下面是一个巴特沃斯低通滤波器去除图像中高斯噪声的程序实例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读入原始图像并加入高斯噪声
img = cv2.imread('input.jpg', 0)
noise = np.random.normal(0, 20, img.shape)
img_noise = np.uint8(np.clip(np.float32(img) + noise, 0, 255))
# 进行傅里叶变换
f = np.fft.fft2(img_noise)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
# 设计巴特沃斯低通滤波器
rows, cols = img_noise.shape
crow, ccol = rows // 2, cols // 2
D = 30 # 截止频率
n = 2 # 阶数
b, a = cv2.butter(n, D / (ccol * 2)) # 设计滤波器
# 将滤波器应用到频域图像中
fshift[crow - 10:crow + 10, ccol - 10:ccol + 10] = 0 # 去除高频噪声
fshift_filtered = np.zeros_like(fshift)
for i in range(rows):
fshift_filtered[i, :] = np.convolve(fshift[i, :], b, mode='same')
for j in range(cols):
fshift_filtered[:, j] = np.convolve(fshift_filtered[:, j], b, mode='same')
# 进行反傅里叶变换
f_filtered = np.fft.ifftshift(fshift_filtered)
img_filtered = np.abs(np.fft.ifft2(f_filtered))
# 显示结果
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(img_noise, cmap='gray')
plt.title('Image with Gaussian Noise'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_filtered, cmap='gray')
plt.title('Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
其中,`cv2.butter(n, Wn)` 函数用于设计一个巴特沃斯滤波器,其中 `n` 是滤波器的阶数,`Wn` 是截止频率。`np.convolve(a, b, mode='same')` 函数用于将滤波器应用到频域图像中。最终,程序会显示原始图像、加入高斯噪声后的图像、频谱图以及滤波后的图像。
阅读全文