版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
中值滤波
中值滤波的算法原理是,首先确定一个奇数像素的窗口W,窗口内各像素按灰度大小排队后,用其中间位置的灰度值代替原
灰度值成为窗口中心的灰度值
。
其中,W为选定窗口的大小; 为窗口W的像素灰度值。通常窗口内像素为奇数,以便于有中间像素。若窗口内的像素为偶数时,则中值取中间两像素灰度值的平均值。算法步骤如下:
- 1 将模板在图像中漫游,并将模板中心与图中的某个像素位置重合;
- 2 读取模板下各对应像素的灰度值;
- 3 将模板对应的像素灰度值从小到大排序
- 4 选取灰度序列里排在中间的一个像素的灰度值
- 5 将这个中间值赋给对应模板中心位置的像素作为像素的灰度值。
二维中值滤波的窗口形状尺寸对滤波效果影响较大,不同的图像内容和不同的应用要求往往采用不同的窗口形状和尺寸。常见滤波窗口形状如下图所示:
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
程序运行结果:
左边为原图像,右边为中值滤波后的图像