改进中值滤波器以处理具有重脉冲(椒盐)噪声的图像

Improving a median filter to process images with heavy impulse (salt&pepper) noise

我有一张被脉冲(椒盐)噪声严重遮盖的图像,我正在尝试使用中值滤波器对其进行过滤。我能够将图片过滤到稍微可读的状态,但我希望它们过滤出更清晰的图像。如何改进我的中值滤波器?

图片用(n,m,4)数组表示,灰度rgb值介于0(黑色)和1(白色)之间。我为我的中值滤波器使用了一个 3x3 矩阵,并在图像的每个边缘周围给了一个 1 像素宽的白色边框。

def medianFilter(image=np.ndarray):
for i in range(1,image.shape[0]):
    for j in range(1,image.shape[1]):
        square = np.array(image[i-1:i+2,j-1:j+2])            
        if(square[1,1][0]==1 or square[1,1][0]==0):
            square[1,1] = np.median((square))
            image[i-1:i+2,j-1:j+2] = square
return image

好的,从您上传的图片开始,我们可以执行以下操作:

import numpy as np
from scipy.signal import medfilt2d
import matplotlib.pyplot as plt
import cv2

img           = cv2.imread('fBq2z.png', cv2.IMREAD_GRAYSCALE)

中值滤波

处理椒盐噪声的最佳方法是使用中值滤波器。由于中值滤波器直接受内核大小的影响,太小不足以进行良好的中值估计,太大会在中值滤波器中捕获伪影。在尝试了不同的内核大小后,11 是最好的。

median_kernel = 11
# median filtering
median_filtered = medfilt2d(img, kernel_size=median_kernel)

中值滤波环的结果为:

图像修复

下一阶段将修复盐和胡椒突出的地方。这是使用图像修复完成的。传统修复通常使用两种算法,现代方法使用神经网络。

我会用Telea的方法。我们首先生成有噪声残差的掩码:

# creating a mask for the salt&pepper
mask = np.zeros_like(median_filtered)
mask[median_filtered < 5]   = 255
mask[median_filtered > 250] = 255

结果掩码:

并应用修复

last = cv2.inpaint(median_filtered,mask,3,cv2.INPAINT_TELEA)

这给了我们最终的结果: