利用python的skimage库实现自适应中值滤波的改进算法对添加了椒盐和高斯噪声的lena图像进行去噪,输出峰值信噪比和均方误差,最后说明改进的自适应中值滤波算法的原理和相比中值滤波的改进之处、优点
时间: 2024-03-26 19:35:22 浏览: 133
好的,我来为你解答。
首先,需要导入 skiamge 库和一些其他必要的库:
```python
from skimage.io import imread, imsave
from skimage.filters import median, gaussian
from skimage.util import random_noise
import numpy as np
import math
```
然后,读入添加了椒盐和高斯噪声的 Lena 图像:
```python
img = imread('lena.png', as_gray=True)
img_salt_pepper = random_noise(img, mode='s&p', salt_vs_pepper=0.5)
img_gauss = random_noise(img, mode='gaussian', var=0.01)
```
接下来,我们实现改进的自适应中值滤波算法:
```python
def adaptive_median_filter(img, S_max):
S = 3
while S <= S_max:
Zmin = median(img, selem=np.ones((S, S)))
Zmax = median(img, selem=np.ones((S, S)))
Zmed = median(img, selem=np.ones((S, S)))
Sxy = img - Zmed
cond1 = (Zmed - Zmin) > 0
cond2 = (Zmed - Zmax) < 0
cond3 = (Zxy > 0)
cond4 = (S < S_max)
cond5 = (np.sum(cond3) > 0)
if np.logical_and.reduce((cond1, cond2, cond3, cond4, cond5)):
return Zmed
else:
S += 2
return Zmed
```
其中,S_max 表示滤波器的最大尺寸,Zmin、Zmax 和 Zmed 分别表示滤波器内的最小值、最大值和中值,Zxy 表示当前像素和中心像素的差值。算法的核心思想是根据滤波器内的像素值的分布情况来动态调整滤波器的大小,从而达到更好的去噪效果。
接下来,我们对添加了椒盐和高斯噪声的 Lena 图像进行去噪,并输出峰值信噪比和均方误差:
```python
img_salt_pepper_denoised = adaptive_median_filter(img_salt_pepper, 7)
img_gauss_denoised = adaptive_median_filter(img_gauss, 7)
psnr_salt_pepper = 10 * math.log10(1 / np.mean((img - img_salt_pepper_denoised) ** 2))
mse_salt_pepper = np.mean((img - img_salt_pepper_denoised) ** 2)
psnr_gauss = 10 * math.log10(1 / np.mean((img - img_gauss_denoised) ** 2))
mse_gauss = np.mean((img - img_gauss_denoised) ** 2)
print('PSNR of salt and pepper noise image:', psnr_salt_pepper)
print('MSE of salt and pepper noise image:', mse_salt_pepper)
print('PSNR of gaussian noise image:', psnr_gauss)
print('MSE of gaussian noise image:', mse_gauss)
```
最后,我们来说明改进的自适应中值滤波算法的原理和相比中值滤波的改进之处、优点。
相比于传统的中值滤波算法,改进的自适应中值滤波算法可以根据滤波器内的像素值分布情况来动态调整滤波器的大小,从而更有效地去除不同程度的噪声。此外,改进的自适应中值滤波算法还可以有效地保留图像细节,避免了传统中值滤波算法产生的模糊现象。
最后,需要注意的是,自适应中值滤波算法需要调整的参数比较多,需要根据具体的应用场景进行调整。
阅读全文