python OpenCV 中 Kmeans 函数详解

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 = centers4[labels.flatten()]
dst = res.reshape((img.shape))

cv2.imwrite("img/autumn4.png",dst)

 

### 设置OpenCVKMeans算法的参数 在OpenCV中使用`cv2.kmeans()`函数进行数据聚类时,需注意几个重要参数及其配置方式。 #### 输入样本格式 输入样本应为`np.float32`数据类型,并且每个特征应该放置在一个单独的列中。这意味着如果要处理的数据不是这种格式,则需要先转换成该形式[^1]。 ```python import numpy as np data = np.random.randint(0, 100, (50, 2)).astype(np.float32) ``` #### 簇的数量设定 通过指定`nclusters(K)`来定义期望得到的簇数量。这个数值直接影响到最终分类的结果数目,在实际应用中通常基于具体需求或领域知识决定最优值。 #### 迭代终止条件 迭代终止条件由`criteria`参数控制,其结构是一个三元组`(type, max_iter, epsilon)`: - `type`: 表示终止条件的种类,可选值有`cv2.TERM_CRITERIA_EPS`(当两次迭代之间的误差小于给定阈值时停止)、`cv2.TERM_CRITERIA_MAX_ITER`(达到最大迭代次数后停止),以及两者的组合`cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER`。 - `max_iter`: 设定了允许的最大迭代次数。 - `epsilon`: 定义了作为收敛标准的变化量上限;一旦变化幅度低于此值即认为已经找到局部最小解并结束计算过程。 下面给出一段完整的代码片段用于展示这些概念的实际运用情况: ```python import cv2 from matplotlib import pyplot as plt # 假设已有准备好的浮点型二维数组 data compactness, labels, centers = cv2.kmeans( data, K=3, # 要分成几类 bestLabels=None, criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0), attempts=10, # 尝试运行算法的次数,取最佳结果 flags=cv2.KMEANS_RANDOM_CENTERS ) # 可视化结果... plt.scatter(data[:, 0], data[:, 1]) plt.scatter(centers[:, 0], centers[:, 1], s=80, c='red', marker='s') plt.show() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值