KNN平滑滤波算法实现
时间: 2024-01-21 19:16:03 浏览: 14
KNN平滑滤波算法是一种基于相邻像素值的滤波方法,可以用来去除图像中的噪声。其基本思想是对于每个像素点,选择其周围K个最相似的像素点的平均值作为该像素点的新值,从而达到平滑的效果。
下面是KNN平滑滤波算法的实现代码:
```python
import cv2
import numpy as np
def knn_smooth(img, k):
# 获取图像的行数和列数
rows, cols = img.shape[:2]
# 创建一个全零的输出图像
out = np.zeros_like(img)
# 对于每个像素点,计算其周围K个最相似的像素点的平均值
for i in range(rows):
for j in range(cols):
# 计算当前像素点周围K个像素点的距离
dist = []
for m in range(max(0, i-k), min(rows, i+k+1)):
for n in range(max(0, j-k), min(cols, j+k+1)):
if m == i and n == j:
continue
dist.append((m, n, np.sum(np.abs(img[i,j,:] - img[m,n,:]))))
# 根据距离排序,选择K个最近的像素点
dist = sorted(dist, key=lambda x:x[2])
sum_value = np.zeros((1,3))
for idx in range(min(k, len(dist))):
sum_value += img[dist[idx][0], dist[idx][1],:]
# 计算平均值并将其赋值给输出图像
out[i,j,:] = sum_value / min(k, len(dist))
return out
```
其中,img表示输入图像,k表示选择的最相似的像素点个数。在代码中,我们首先创建了一个全零的输出图像,然后对于每个像素点,计算其周围K个最相似的像素点的平均值,并将其赋值给输出图像。在计算距离和排序的过程中,我们使用了numpy的数组操作,以提高代码的运行效率。
下面是一个使用KNN平滑滤波算法对图像进行去噪的例子:
```python
# 读取原始图像
img = cv2.imread('lena.jpg')
# 添加高斯噪声
noise = np.random.normal(0, 50, img.shape)
img_noise = img + noise
# 对图像进行KNN平滑滤波
img_smooth = knn_smooth(img_noise.astype(np.float32), k=10).astype(np.uint8)
# 显示去噪后的图像
cv2.imshow('Smoothed Image', img_smooth)
cv2.waitKey(0)
```