Mean-shift算法是一种非参数密度估计算法,主要用于图像分割、目标跟踪和聚类等领域。其基本原理是以某个点为中心,计算该点周围所有点的密度,并将中心点移动到密度最大的位置,不断迭代,直到中心点不再移动或满足停止条件为止。
目录
思路理解
算法步骤
python代码
有意思的知识又增加了,祝大家1024快乐
相比kmeans聚类,Meanshift 最大的优势是不需要人为指定分成几类。该算法会根据分布密度自动将数据归到适合的类中。
Meanshift 聚类算法的大致思想就是 “哪里人多哪里跑” .(借鉴大佬的思路理解,一下就明白)
ps:上面涉及的三个超参是需要用户人为指定的哈。
Mean-shift算法的步骤如下:
1. 初始化起始点。
2. 构建核函数,计算当前点周围所有点的权值。
3. 计算当前点的质心(即密度最大的位置),并将该点移动到质心位置。
4. 判断移动距离是否小于阈值,若小于则停止迭代,否则返回步骤2。
5. 将所有点分配到最终的簇中。
通过不断移动中心点,Mean-shift算法最终将所有数据点聚类到它们最密集的区域。由于Mean-shift算法不需要预先指定簇的个数,因此它被广泛应用于图像分割和目标跟踪等领域。
高斯核函数只是用来计算映射到高维空间之后的内积的一种简便方法,目的为让低维的不可分数据变成高维可分。利用核函数,可以忽略映射关系,直接在低维空间中完成计算。
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg')
# 对图像进行分割
# 使用均值漂移算法构建初始聚类中心
# 然后使用KMeans算法进一步优化聚类效果
Z = img.reshape((-1,3)).astype('float32')
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
ret, label, center = cv2.kmeans(Z, 8, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# 将每个像素的标签转换为其对应的中心颜色
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))
# 显示结果
cv2.imshow('Original image', img)
cv2.imshow('Segmented image', res2)
cv2.waitKey(0)
cv2.destroyAllWindows()
⛵⛵⭐⭐