改进中值滤波器以处理具有重脉冲(椒盐)噪声的图像
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)
这给了我们最终的结果:
我有一张被脉冲(椒盐)噪声严重遮盖的图像,我正在尝试使用中值滤波器对其进行过滤。我能够将图片过滤到稍微可读的状态,但我希望它们过滤出更清晰的图像。如何改进我的中值滤波器?
图片用(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)
这给了我们最终的结果: