社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
中值滤波的算法原理是,首先确定一个奇数像素的窗口W,窗口内各像素按灰度大小排队后,用其中间位置的灰度值代替原f(x,y)灰度值成为窗口中心的灰度值g(x,y)。
g(x,y)=Medf(x−k,y−l),(k,l∈W)(04-1)
其中,W为选定窗口的大小; f(x−k,y−l)为窗口W的像素灰度值。通常窗口内像素为奇数,以便于有中间像素。若窗口内的像素为偶数时,则中值取中间两像素灰度值的平均值。算法步骤如下:
二维中值滤波的窗口形状尺寸对滤波效果影响较大,不同的图像内容和不同的应用要求往往采用不同的窗口形状和尺寸。常见滤波窗口形状如下图所示:
Python语言实现的代码如下:
def median_filter(img, n=3):
image = np.array(img, copy=True).astype(np.float32)
processed = np.zeros_like(image)
middle = int(n/2)
r = np.zeros(n*n)
g = np.zeros(n*n)
b = np.zeros(n*n)
for x in range(middle, image.shape[0] - middle):
for y in range(middle, image.shape[1] - middle):
cont = 0
for i in range(x - middle, x + middle + 1):
for j in range(y - middle, y + middle + 1):
r[cont] = image[i][j][0]
g[cont] = image[i][j][1]
b[cont] = image[i][j][2]
cont += 1
r.sort()
g.sort()
b.sort()
processed[x][y][0] = r[int(n*n/2)]
processed[x][y][1] = g[int(n*n/2)]
processed[x][y][2] = b[int(n*n/2)]
processed = np.clip(processed,0,255).astype(np.uint8)
return processed
程序运行结果:
左边为原图像,右边为中值滤波后的图像
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!