《OpenCV 轻松入门 面向Python》 学习笔记
函数原型:
retval, bestLabels, centers=cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)
参数:
- data 输入的待处理数据集合,应该是 np.float32 类型,每个特征放在单独的一列中。
- K 分出的簇的个数,就是分类的个数,一般就是 K =2 表示二分类。
- bestLabels 表示计算后各个数据点最终分类标签(索引),实际调用时,设置为None。
- criteria 算法迭代的终止条件。当达到最大循环数目或者指定的精度阈值时,算法停止继续分类迭代计算。这个参数由三个子参数构成:type, max_iter , eps。
- type 终止类型,有三种情况。
– cv2.TERM_CRITERIA_EPS:精度满足 eps 时,停止迭代
– cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过阈值 max_iter 时,停止迭代
– cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER:上述两个条件中的任意一个满足时,停止迭代。 - max_iter 最大迭代次数
- eps 精确的阈值
- type 终止类型,有三种情况。
- attempts 让算法使用不同的初始值进行 attempts 次尝试
- flags 表示选择初始中心点的方法:
- cv2.KMEANS_RANDOM_CENTERS:随机选取中心点。
- cv2.KMEANS_PP_CENTERS:基于中心化算法选取中心点。
- cv2.KMEANS_USE_INITIAL_LABELS:使用用户输入的数据作为第一次分类中心点;如果算法需要尝试多次(attempts 值大于 1 时),后续尝试都是使用随机值或者半随机值作为第一次分类中心点。
返回值
- retval 返回的距离值(也称为密度值或紧密度),返回各个点到相应中心距离的平方和。
- bestLabels 各个数据点额最终分类标签(索引)
- centers,每个分类的中心点数据。
举例:
import numpy as np
import cv2
import matplotlib.pyplot as plt
xiaoMI = np.random.randint(0, 50, 60)
daMI = np.random.randint(200, 250, 60)
MI = np.hstack((xiaoMI, daMI))
MI = MI.reshape((120, 1)).astype(np.float32)
criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
flags = cv2.KMEANS_RANDOM_CENTERS
retval, best_Labels, centers = cv2.kmeans(MI, 2, None, criteria, 10, flags)
print(retval)
print(best_Labels)
print(centers)
XM = MI[best_Labels==0]
DM = MI[best_Labels==1]
plt.plot(XM, 'ro')
plt.plot(DM, 'bo')
plt.plot(centers[0], 'rx')
plt.plot(centers[1], 'bx')
plt.show()