python k均值聚类,opencv聚类分析
主要介绍opencvK均值聚类在python中的实现实例,通过实例代码非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友下面和边肖一起学习。
目录
K-means聚类的基本步骤K-means聚类模块的简单示例
K均值聚类
当预测值为离散值时,所做的工作就是“分类”。当预测值为连续值时,所做的功为“回归”。机器学习模型还可以将训练集中的数据分成若干组,每组称为一个“簇”。这种学习方法被称为“聚类”,其重要特点是在学习过程中不需要对训练样本进行标记。即学习过程可以根据已有的训练集自动完成分类(聚类)。
根据训练数据是否被标注,学习可以分为有监督学习和无监督学习。
k和SVM是监督学习,为算法学习提供标记数据,然后对数据进行分类。
聚类是无监督学习,在事先不知道分类标签是什么的情况下,直接对数据进行分类。
聚类可以将具有相似属性的对象划分到同一个集合中(集群)。
聚类方法可以应用于所有对象,簇中的对象越相似,聚类算法就越好。
K均值聚类的基本步骤
K均值聚类是一种简单的聚类算法,它将输入数据划分为K个聚类。该算法不断提取当前分类的中心(也叫质心或重心),最终在分类稳定时完成聚类。
本质上,K-means聚类是一种迭代算法。
在实际处理过程中,需要进行多轮迭代,直到分组稳定不变,才能认为分组完成。
K-means聚类算法的基本步骤如下:
随机选择k个点作为分类的中心点。将每个数据点放在离它最近的中心点所在的类中。重新计算每个分类的数据点的平均值,取平均值作为新的分类中心点。重复步骤2和3,直到分类稳定。可以随机选取K个点作为分类的中心点,也可以随机生成原始数据中不存在的K个数据点作为分类的中心点。
最近的距离:需要某种形式的距离计算。(在具体实施中,可以根据需要采用不同形式的测距方法。)
K均值聚类模块
OpenCV提供了函数cv2.kmeans()来实现k-means聚类。
该函数的语法格式为:
retval,bestLabels,centers=cv2.kmeans(数据,K,最佳标签,标准,尝试,标志)
Data:要处理的输入数据集,应该是np.float32类型,每个特征在单独的列中。k:要划分的聚类数,即分类数。最常见的是K=2,表示两种分类。BestLabels:表示计算后每个数据点的最终分类标签(索引)。实际调用时,参数bestLabels的值被设置为None。准则:算法迭代的终止条件。当达到最大循环数或指定的精度阈值时,算法停止分类的迭代计算。该参数由三个子参数组成,即type、max_iter和eps。Type表示终止的类型,有三种情况:cv2。TERM_CRITERIA_eps:当精度满足eps时,迭代停止。2.CVTerm _ Criteria _ max_iter:当迭代次数超过阈值max_iter时,迭代停止。2.term _ criteria _ EPS cv 2 . term _ criteria _ max _ ITER:当满足上述两个条件中的任何一个时,迭代停止。Max_iter:最大迭代次数。Eps:精准的门槛。尝试次数:在具体实现中,为了获得最佳的分类效果,可能需要使用不同的初始分类值进行多次尝试。通过指定尝试的值,该算法可以使用不同的初始值进行多次尝试。标志:表示选择初始中心点的方法。主要有以下三种方法。2.Kmeans _ random _ centers:随机选择中心点。
>cv2.KMEANS_PP_CENTERS:基于中心化算法选取中心点。
简单例子
例1:
随机生成一组数据,使用函数cv2.kmeans()对其分类。
- 一组数据在[0,50]区间
- 另一组数据在[200,250]区间
- 使用函数cv2.kmeans()对它们分类。
主要步骤如下:
数据预处理
使用随机函数随机生成两组数据,并将它们转换为函数cv2.kmeans()可以处理的格式。
设置参数
设置函数cv2.kmeans()的参数形式。将参数criteria的值设置为(cv2.TERM_CRITERIA_EPS+ cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0),在达到一定次数或者满足一定精度时终止迭代。
调用函数cv2.kmeans()
调用函数cv2.kmeans(),获取返回值,用于后续步骤的操作。
确定分类
根据函数cv2.kmeans()返回的标签(0和1),将原始数据分为两组
显示结果
绘制经过分类的数据及中心点,观察分类结果。
完整程序:
import numpy as npimport cv2
from matplotlib import pyplot as plt
# 随机生成两组数组
# 生成60个值在[0,50]内的数据
num1 = np.random.randint(0,50,60)
# 生成60个值在[200,250]内的数据
num2 = np.random.randint(200,250,60)
# 组合数据为num
num = np.hstack((num1, num2))
# 使用reshape函数将其转换为(120,1)
num = num.reshape((120,1)) #每个数据为1列
# 转换为float32类型
num = np.float32(num)
# 调用kmeans模块
# 设置参数criteria的值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
# 设置参数flags的值
flags = cv2.KMEANS_RANDOM_CENTERS
# 调用函数kmeans
retval, bestLabels, centers = cv2.kmeans(num,2, None, criteria,10, flags)
# 打印返回值
print(retval)
print(bestLabels)
print(centers)
# 获取分类结果
n1 = num[bestLabels==0]
n2 = num[bestLabels==1]
# 绘制分类结果
# 绘制原始数据
plt.plot(np.ones(len(n1)),n1,ro)
plt.plot(np.ones(len(n2)),n2,bo)
# 绘制中心点
#plt.plot([1],centers[0],rx)
#plt.plot([1],centers[1],bx)
plt.show()
例2:
有两种物体:
- 物体1的长和宽都在 [0,20] 内
- 物体2的长和宽都在[40,60] 内
使用随机数模拟两种物体的长度和宽度,并使用函数cv2.kmeans()对它们分类。
根据题目要求,主要步骤如下:
- 随机生成数据,并将它们转换为函数cv2.kmeans()可以处理的形式。
- 设置函数cv2.kmeans()的参数形式。
- 调用函数cv2.kmeans()。
- 根据函数cv2.kmeans()的返回值,确定分类结果。
- 绘制经过分类的数据及中心点,观察分类结果。
import numpy as npimport cv2
from matplotlib import pyplot as plt
# 随机生成两组数值
#长和宽都在[0,20]内
m1 = np.random.randint(0,20, (30,2))
#长和宽的大小都在[40,60]
m2 = np.random.randint(40,60, (30,2))
# 组合数据
m = np.vstack((m1, m2))
# 转换为float32类型
m = np.float32(m)
# 调用kmeans模块
# 设置参数criteria值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
# 调用kmeans函数
ret, label, center=cv2.kmeans(m,2, None, criteria,10, cv2.KMEANS_RANDOM_CENTERS)
#打印返回值
print(ret)
print(label)
print(center)
# 根据kmeans的处理结果,将数据分类,两大类
res1 = m[label.ravel()==0]
res2 = m[label.ravel()==1]
# 绘制分类结果数据及中心点
plt.scatter(res1[:,0], res1[:,1], c = g, marker = s)
plt.scatter(res2[:,0], res2[:,1], c = r, marker = o)
plt.scatter(center[0,0], center[0,1], s = 200, c = b, marker = o)
plt.scatter(center[1,0], center[1,1], s = 200, c = b, marker = s)
plt.xlabel(Height), plt.ylabel(Width)
plt.show()
例3:
使用函数cv2.kmeans()将灰度图像处理为只有两个灰度级的二值图像。
需要对灰度图像内的色彩进行分类,将所有的像素点划分为两类。然后,用这两类的中心点像素值替代原有像素值,满足题目的要求。
主要步骤如下:
图像预处理
读取图像,并将图像转换为函数cv2.kmeans()可以处理的形式。
在读取图像时,如果是3个通道的RGB图像,需要将图像的RGB值处理为一个单独的特征值。具体实现时,用函数cv2.reshape()完成对图像特征值的调整。
为了满足函数cv2.kmeans()的要求,需要将图像的数据类型转换为numpy.float32类型。
设置函数cv2.kmeans()的参数形式
设置参数criteria的值为(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0),让函数cv2.kmeans()在达到一定精度或者达到一定迭代次数时,即停止迭代。
设置参数K的值为2,将所有像素划分为两类。
调用函数cv2.kmeans()
调用函数cv2.kmeans(),得到距离值、分类中心点和分类标签,用于后续操作。
值替换
将像素点的值替换为当前分类的中心点的像素值。
显示变换前后的图像
分别显示原始图像和二值化图像。
import numpy as npimport cv2
import matplotlib.pyplot as plt
# 读取待处理图像
img = cv2.imread(./img/hand2.png)
# 使用reshape将一个像素点的RGB值作为一个单元处理
data = img.reshape((-1,3)) # n行 3列
# 转换为kmeans可以处理的类型
data = np.float32(data)
# 调用kmeans模块
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K =2
ret, label, center=cv2.kmeans(data, K, None, criteria,10, cv2.KMEANS_RANDOM_CENTERS)
# 转换为uint8数据类型,将每个像素点都赋值为当前分类的中心点像素值
# 将center的值转换为uint8
center = np.uint8(center)
# 使用center内的值替换原像素点的值
res1 = center[label.flatten()] # 根据索引来取值,最后结果的大小同索引的大小
# 使用reshape调整替换后的图像
res2 = res1.reshape((img.shape))
# 显示处理结果
plt.subplot(121)
plt.imshow(img[:,:,::-1])
plt.axis(off)
plt.subplot(122)
plt.imshow(res2[:,:,::-1])
plt.axis(off)
plt.show()
调整程序中的K值,就能改变图像的显示结果。例如,K=8,则可以让图像显示8个灰度级。
到此这篇关于python中opencv K均值聚类的实现示例的文章就介绍到这了,更多相关opencv K均值聚类内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。