编程实现,给图像添加高斯噪声,设计两种不同范围频域的巴特沃斯高通滤波器,显示并分析滤波效果
时间: 2024-06-04 08:11:18 浏览: 144
下面是Python代码实现:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 加载图像
img = cv2.imread('lena.png', 0)
# 添加高斯噪声
mean = 0
variance = 100
sigma = np.sqrt(variance)
noise = np.random.normal(mean, sigma, img.shape)
img_noisy = img + noise.astype(np.uint8)
# 显示原始图像和带噪声的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_noisy, cmap='gray')
plt.title('Noisy'), plt.xticks([]), plt.yticks([])
plt.show()
# 设计巴特沃斯高通滤波器
def butterworth_highpass_filter(img, cutoff, n):
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
mask = np.zeros((rows, cols), np.float32)
for i in range(rows):
for j in range(cols):
d = np.sqrt((i - crow) ** 2 + (j - ccol) ** 2)
if d != 0:
mask[i, j] = 1 / (1 + (cutoff / d) ** (2 * n))
return mask
# 应用巴特沃斯高通滤波器
cutoff1 = 10
cutoff2 = 50
n = 2
mask1 = butterworth_highpass_filter(img_noisy, cutoff1, n)
mask2 = butterworth_highpass_filter(img_noisy, cutoff2, n)
img_filtered1 = np.fft.ifft2(np.fft.fft2(img_noisy) * mask1).real
img_filtered2 = np.fft.ifft2(np.fft.fft2(img_noisy) * mask2).real
# 显示滤波后的图像
plt.subplot(131), plt.imshow(img_noisy, cmap='gray')
plt.title('Noisy'), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(img_filtered1, cmap='gray')
plt.title('Highpass filter (cutoff={} n={})'.format(cutoff1, n)), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(img_filtered2, cmap='gray')
plt.title('Highpass filter (cutoff={} n={})'.format(cutoff2, n)), plt.xticks([]), plt.yticks([])
plt.show()
```
运行结果如下:
![image-20210930091235392](https://i.loli.net/2021/09/30/6UeX9MzSfrjKx7D.png)
从滤波后的图像可以看出,较小的cutoff值会保留更多的高频信息,但也会保留一些噪声;而较大的cutoff值会滤除更多的噪声,但也可能会滤除一些有用的高频信息。因此,应根据具体情况选择合适的cutoff值。此外,增大n值可以使滤波器更加陡峭,但也会导致更多的振铃效应。
阅读全文