利用skimage实现中值滤波算法的改进并用改进算法对添加了混合噪声的lena图像进行去噪并输出峰值信噪比与均方误差
时间: 2024-02-19 17:57:44 浏览: 71
基于图像去噪的混合噪声滤波算法
5星 · 资源好评率100%
好的,我了解了您的问题。首先,skimage中已经实现了中值滤波算法,您可以直接调用`skimage.filters.median`函数进行中值滤波。如果您想要改进中值滤波算法,可以考虑使用自适应中值滤波算法,该算法可以根据像素点周围的像素值动态调整中值滤波器的大小,以提高去噪效果。
以下是使用skimage实现自适应中值滤波算法对添加混合噪声的lena图像进行去噪的示例代码:
```python
import numpy as np
from skimage import io, filters
def adaptive_median_filter(img):
img_median = filters.median(img, np.ones((3,3))) # 先进行一次普通的中值滤波
img_min = filters.minimum(img, np.ones((3,3))) # 计算每个像素周围像素的最小值
img_max = filters.maximum(img, np.ones((3,3))) # 计算每个像素周围像素的最大值
img_median_min = filters.median(img_min, np.ones((3,3))) # 计算最小值的中值
img_median_max = filters.median(img_max, np.ones((3,3))) # 计算最大值的中值
img_a = img_median - img_median_min # 计算A1
img_b = img_median - img_median_max # 计算A2
img_c = img_a + img_b # 计算A3
img_s = np.zeros_like(img)
img_s[img_c != 0] = np.abs(img_a[img_c != 0]) / np.abs(img_c[img_c != 0]) # 计算S
img_t = np.zeros_like(img)
img_t[img_c != 0] = np.abs(img_b[img_c != 0]) / np.abs(img_c[img_c != 0]) # 计算T
img_result = np.zeros_like(img)
img_result[(img_a > 0) & (img_b > 0)] = img_median[(img_a > 0) & (img_b > 0)] # 如果A1和A2都大于0,说明中心像素是噪声,不进行滤波
img_result[(img_a <= 0) & (img_b <= 0)] = img_median[(img_a <= 0) & (img_b <= 0)] # 如果A1和A2都小于0,说明中心像素不是噪声,不进行滤波
img_result[(img_a > 0) & (img_b <= 0) & (img_s <= 1)] = img_median[(img_a > 0) & (img_b <= 0) & (img_s <= 1)] # 如果A1大于0,A2小于等于0,并且S小于等于1,说明中心像素可能是噪声,进行滤波
img_result[(img_a <= 0) & (img_b > 0) & (img_t <= 1)] = img_median[(img_a <= 0) & (img_b > 0) & (img_t <= 1)] # 如果A1小于等于0,A2大于0,并且T小于等于1,说明中心像素可能是噪声,进行滤波
img_result[(img_a > 0) & (img_b <= 0) & (img_s > 1)] = img_median_min[(img_a > 0) & (img_b <= 0) & (img_s > 1)] # 如果A1大于0,A2小于等于0,并且S大于1,说明中心像素可能是噪声,进行滤波
img_result[(img_a <= 0) & (img_b > 0) & (img_t > 1)] = img_median_max[(img_a <= 0) & (img_b > 0) & (img_t > 1)] # 如果A1小于等于0,A2大于0,并且T大于1,说明中心像素可能是噪声,进行滤波
return img_result
# 读取lena图像并添加混合噪声
img = io.imread('lena.png', as_gray=True)
img = img.astype(np.float64) / 255.0
noise = np.random.normal(loc=0, scale=0.1, size=img.shape)
img_noisy = np.clip(img + noise, 0, 1)
# 进行自适应中值滤波并输出峰值信噪比与均方误差
img_denoised = adaptive_median_filter(img_noisy)
psnr = 20 * np.log10(1.0 / np.sqrt(np.mean((img - img_denoised) ** 2)))
mse = np.mean((img - img_denoised) ** 2)
print('PSNR: {:.2f} dB'.format(psnr))
print('MSE: {:.4f}'.format(mse))
# 显示原始图像、加噪图像和去噪图像
io.imshow_collection([img, img_noisy, img_denoised])
io.show()
```
注意:由于自适应中值滤波算法的计算量较大,上述代码可能需要一些时间才能完成运行。
阅读全文