K近邻(knn)中值滤波器(KNNMF)原理及python代码

这是K近邻平滑滤波器的另一种方法——k近邻中值滤波器,在K近邻均值滤波器中有详细的介绍K近邻均值滤波器。

原理

在K近邻中值滤波器中,不选k个邻近像素的平均灰度来代替,而选k个邻近像素的中值灰度来代替。
在这里插入图片描述

python代码

img= np.array([[1,2,1,4,3],
                [1,2,2,3,4],
                [5,7,6,8,9],
                [5,7,6,8,8],
                [5,6,7,8,9]])

def meanKernel(center,matrix,k):  #center:要替换点的坐标,matrix:目标所在kernel矩阵,k:近邻数
    matrix = matrix.astype('int')
    list1 = [[abs(i-center),i] for i in matrix.ravel()]   #对目标所在的矩阵平铺展开,然后相减,然后排序,前k个对应的
    list1.sort()
    print(list1)  #打印出排序后的list 
    print(np.sort(np.array(list1)[:k,1]))  
    return np.median(np.sort(np.array(list1)[:k,1]))  #  取中位数

kernel = 3 #3*3模板
k = 5 #k近邻个数
def KNN(img,kernel,k):
    result_img = img.copy()
    for i in range(result_img.shape[0]-kernel+1):  #(0,3)
        for j in range(result_img.shape[0]-kernel+1):
            result_img[i+int(kernel/2)][j+int(kernel/2)] = meanKernel(result_img[i+int(kernel/2)][j+int(kernel/2)],img[i:i+kernel,j:j+kernel],5)
    return result_img

效果展示

[[0, 2], [0, 2], [0, 2], [1, 1], [1, 1], [1, 1], [3, 5], [4, 6], [5, 7]]
[1 1 2 2 2]
[[0, 2], [0, 2], [0, 2], [1, 1], [1, 3], [2, 4], [4, 6], [5, 7], [6, 8]]
[1 2 2 2 3]
[[0, 3], [0, 3], [1, 2], [1, 4], [1, 4], [2, 1], [3, 6], [5, 8], [6, 9]]
[2 3 3 4 4]
[[0, 7], [0, 7], [1, 6], [1, 6], [2, 5], [2, 5], [5, 2], [5, 2], [6, 1]]
[5 6 6 7 7]
[[0, 6], [0, 6], [1, 7], [1, 7], [2, 8], [2, 8], [3, 3], [4, 2], [4, 2]]
[6 6 7 7 8]
[[0, 8], [0, 8], [0, 8], [1, 9], [2, 6], [2, 6], [4, 4], [5, 3], [6, 2]]
[6 8 8 8 9]
[[0, 7], [0, 7], [0, 7], [1, 6], [1, 6], [1, 6], [2, 5], [2, 5], [2, 5]]
[6 6 7 7 7]
[[0, 6], [0, 6], [0, 6], [1, 7], [1, 7], [1, 7], [2, 8], [2, 8], [2, 8]]
[6 6 6 7 7]
[[0, 8], [0, 8], [0, 8], [0, 8], [1, 7], [1, 9], [1, 9], [2, 6], [2, 6]]
[7 8 8 8 8]
array([[1, 2, 1, 4, 3],
       [1, 2, 2, 3, 4],
       [5, 6, 7, 8, 9],
       [5, 7, 6, 8, 8],
       [5, 6, 7, 8, 9]])
发布了5 篇原创文章 · 获赞 3 · 访问量 654

猜你喜欢

转载自blog.csdn.net/Angelia_yue/article/details/105705714