K-Means聚类算法的原理流程:
- 第一步:确定K值,聚类成K个类簇。
- 第二步:从数据中随机选择(或按照某种方式)K个数据点作为初始分类的中心。
- 第三步:分别计算数据中每个点到每个中心的距离,将每个点划分到离中心最近的类中
- 第四步:当每个中心都划分了一些点后,去每个类的均值,选出新的中心。
- 第五步:比较新的中心和之前的中心,如果新的中心和之前的中心之间的距离小于某阈值,或迭代次数超过某阈值,认为聚类已经收敛,终止。
- 第六步:否则继续迭代执行第三到五步,直到第五步满足。
函数原型:
retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags, centers=None)
函数参数:
-
data: 需要分类数据,最好是np.float32的数据,每个特征放一列。
-
K: 聚类个数
-
bestLabels:预设的分类标签或者None
-
criteria:迭代停止的模式选择,这是一个含有三个元素的元组型数。格式为(type, max_iter, epsilon) 其中,type有如下模式:
- cv2.TERM_CRITERIA_EPS :精确度(误差)满足epsilon,则停止。
- cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过max_iter,则停止。
- cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER:两者结合,满足任意一个结束。
-
attempts:重复试验kmeans算法次数,将会返回最好的一次结果
-
flags:初始中心选择,可选以下两种:
- v2.KMEANS_PP_CENTERS:使用kmeans++算法的中心初始化算法,即初始中心的选择使眼色相差最大.详细可查阅kmeans++算法。(Use kmeans++ center initialization by Arthur and Vassilvitskii)
- cv2.KMEANS_RANDOM_CENTERS:每次随机选择初始中心(Select random initial centers in each attempt.)
返回值:
-
compactness:紧密度,返回每个点到相应重心的距离的平方和
-
labels:结果标记,每个成员被标记为分组的序号,如 0,1,2,3,4…等
-
centers:由聚类的中心组成的数组
import cv2 import numpy as np import matplotlib.pyplot as plt #读取原始图像 img = cv2.imread('img/autumn.png') print(img.shape) #(486, 654, 3) #图像二维像素转换为一维 #转换成3列 data = img.reshape((-1,3)) data = np.float32(data) #定义终止条件 (type,max_iter,epsilon) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) #设置初始中心的选择 # flags = cv2.KMEANS_RANDOM_CENTERS flags = cv2.KMEANS_PP_CENTERS #K-Means聚类 聚集成4类 compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags) #图像转换回uint8二维类型 centers = np.uint8(centers) res = centers[labels.flatten()] dst = res.reshape((img.shape)) cv2.imwrite("img/autumn4.png",dst)
————————————————
版权声明:本文为CSDN博主「一只辛巴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lanshi00/article/details/104109963