python图像处理之K近邻(KNN)平滑滤波器

边界保持类平滑滤波器——思想

为了解决图像模糊问题,一个自然的想法就是,在进行平滑处理时,首先判别当前像素是否为边界上的点,如果是,则不进行平滑处理;如果不是,则进行平滑处理。

K近邻(KNN)平滑滤波器—— 原理分析

边界保持滤波器的核心是确定边界点与非边界点。 如图所示,点1是黄色区域的非边界点,点2是蓝色区域的边界点。 点1模板中的像素全部是同一区域的; 点2模板中的像素则包括了两个区域。 在模板中,分别选出5个与点1或点2灰度值最相近的点进行计算,则不会出现两个区域信息的混叠平均。 这样,就达到了边界保持的目的。

K近邻(KNNF)均值滤波器—— 实现算法

(1) 以待处理像素为中心,作一个m*m的作用模板。 (2)在模板中,选择K个与待处理像素的灰度差为最小的像素。 (3)将这K个像素的灰度均值替换掉原来的像素值。

python代码

```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]])
kernel = 3 #3*3模板
k = 5 #k近邻个数

#定义均值滤波器函数
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()
    return round(np.array(list1)[:k,1].mean())   #  round() 方法返回浮点数x的四舍五入值。


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):
            #中心点(1,1)= K近邻(KNNF)均值滤波器
            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
效果展示
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]])
经验分享 程序员 微信小程序 职场和发展