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]])
