使用边界保持类平滑滤波器,编写程序,对含噪声(高斯噪声或椒盐噪声)图像进行去噪,并显示去噪前后的图像。
时间: 2023-12-03 19:03:20 浏览: 56
好的,下面是使用Python实现边界保持类平滑滤波器进行图像去噪的示例代码:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread('noisy_image.jpg')
# 将图像转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 添加高斯噪声
mean = 0
var = 100
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img_gray.shape)
noisy_image = np.clip(img_gray + gaussian, 0, 255).astype(np.uint8)
# 添加椒盐噪声
salt_pepper_ratio = 0.05
salt_pepper = np.random.rand(img_gray.shape[0], img_gray.shape[1])
noisy_image[salt_pepper < salt_pepper_ratio] = 0
noisy_image[salt_pepper > 1 - salt_pepper_ratio] = 255
# 定义边界保持类平滑滤波器
def bilateral_filter(image, d, sigma_color, sigma_space):
filtered_image = np.zeros_like(image)
rows, cols = image.shape
for i in range(rows):
for j in range(cols):
filtered_value = 0
normalization = 0
for k in range(max(0, i-d), min(rows, i+d+1)):
for l in range(max(0, j-d), min(cols, j+d+1)):
spatial_distance = np.sqrt((k-i)**2 + (l-j)**2)
range_distance = abs(image[k,l] - image[i,j])
weight = np.exp(-spatial_distance**2/(2*sigma_space**2) - range_distance**2/(2*sigma_color**2))
filtered_value += weight * image[k,l]
normalization += weight
filtered_image[i,j] = filtered_value / normalization
return filtered_image
# 调用边界保持类平滑滤波器进行去噪
filtered_image = bilateral_filter(noisy_image, d=10, sigma_color=25, sigma_space=25)
# 显示原图、含噪声图像以及去噪后的图像
cv2.imshow('Original Image', img_gray)
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Denoised Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在程序中,我们先读取了一张图像并将其转换为灰度图像。然后添加了高斯噪声和椒盐噪声。接着定义了一个边界保持类平滑滤波器,并用该滤波器对含噪声的图像进行了去噪。最后,我们显示原图、含噪声图像以及去噪后的图像。
你可以根据自己的需要更改程序中的参数以及图像的读取方式,以适应不同的应用场景。
阅读全文