使用C++、opencv中的Kmeans进行图像分割
K-means算法的原理
K-means算法是基于距离相似性的聚类算法,通过比较样本之间的相似性,将形式的样本划分到同一个类别中,K-Means算法的基本过程为:
- 初始化常数 ,随机初始化k个聚类中心。
- 重复计算以下过程,直到聚类中心不再改变:
计算每个样本与每个聚类中心之间的相似度,将样本划分到最相似的类别中;
计算划分到每个类别中的所有样本特征的均值,并将该均值作为每个类新的聚类中心;
- 输出最终的聚类中心以及每个样本所属的类别。
在K-Means算法中,需要随机初始化k个聚类中心,而K-Means算法对初始聚类中心的选取较为敏感,若选择的聚类中心不好,则得到的聚类结果会非常差,因此,对K-Means算法提出了很多的改进的方法,如K-Means++算法,在K-Means++算法中,希望初始化的k个聚类中心之间的距离尽可能的大,其具体过程为:
- 在数据集中随机选择一个样本点作为第一个初始化的聚类中心
- 选择出其余的聚类中心:
计算样本中的每一个样本点与已经初始化的聚类中心之间的距离,并选择其中最短的距离
以概率选择距离最大的样本作为新的聚类中心,重复上述过程,直到 个聚类中心都被确定
- 对k个初始化的聚类中心,利用K-Means算法计算最终的聚类中心。
更多关于 K-Means算法的原理可查看:https://www.cnblogs.com/pinard/p/6164214.html
https://blog.csdn.net/loveliuzz/article/details/78783773
opencv中关于Kmeans的API:
double