OpenCV-Python官方教程-31-K值聚类

it2023-04-11  80

OpenCV中的K值聚类

学习使用OpenCV中的函数cv2.kmeans()对数据进行分类

输入参数:

samples: 应该是 np.flfloat32 类型的数据,每个特征应该放在一列。nclusters(K): 聚类的最终数目。criteria: 终止迭代的条件。当条件满足时,算法的迭代终止。它应该是一个含有 3 个成员的元组,它们是(typw,max_iter,epsilon):(1) type 终止的类型:有如下三种选择:1、cv2.TERM_CRITERIA_EPS 只有精确度 epsilon 满足是停止迭代。2、cv2.TERM_CRITERIA_MAX_ITER 当迭代次数超过阈值时停止迭代。3、cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER上面的任何一个条件满足时停止迭代。(2)max_iter 表示最大迭代次数。(3)epsilon 精确度阈值。attempts: 使用不同的起始标记来执行算法的次数。算法会返回紧密度最好的标记。紧密度也会作为输出被返回。flags:用来设置如何选择起始重心。通常我们有两个选择:cv2.KMEANS_PP_CENTERS和 cv2.KMEANS_RANDOM_CENTERS。

输出参数:

compactness:紧密度,返回每个点到相应重心的距离的平方和。labels:标志数组(与上一节提到的代码相同),每个成员被标记为 0,1等centers:由聚类的中心组成的数组。

1 仅有一个特征的数据

import numpy as np import cv2 as cv from matplotlib import pyplot as plt x = np.random.randint(25,100,25) y = np.random.randint(175,255,25) z = np.hstack((x,y)) z = z.reshape((50,1)) z = np.float32(z) # Define criteria = ( type, max_iter = 10 , epsilon = 1.0 ) criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0) # Set flags (Just to avoid line break in the code) flags = cv.KMEANS_RANDOM_CENTERS # Apply KMeans compactness,labels,centers = cv.kmeans(z,2,None,criteria,10,flags) A = z[labels==0] B = z[labels==1] # Now plot 'A' in red, 'B' in blue, 'centers' in yellow plt.hist(A,256,[0,256],color = 'r') plt.hist(B,256,[0,256],color = 'b') plt.hist(centers,32,[0,256],color = 'y') plt.show()

2 二维特征聚类

import numpy as np import cv2 as cv from matplotlib import pyplot as plt X = np.random.randint(25,50,(25,2)) Y = np.random.randint(60,85,(25,2)) Z = np.vstack((X,Y)) # convert to np.float32 Z = np.float32(Z) # define criteria and apply kmeans() criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0) ret,label,center=cv.kmeans(Z,2,None,criteria,10,cv.KMEANS_RANDOM_CENTERS) # Now separate the data, Note the flatten() A = Z[label.ravel()==0] B = Z[label.ravel()==1] # Plot the data plt.scatter(A[:,0],A[:,1]) plt.scatter(B[:,0],B[:,1],c = 'r') plt.scatter(center[:,0],center[:,1],s = 80,c = 'y', marker = 's') plt.xlabel('Height'),plt.ylabel('Weight') plt.show()

3 颜色量化

颜色量化就是减少图片中颜色数目的一个过程。为什么要减少图片中的颜色呢?减少内存消耗!有些设备的资源有限,只能显示很少的颜色。在这种情况下就需要进行颜色量化。我们使用 K 值聚类的方法来进行颜色量化。

现在有 3 个特征:R,G,B。所以我们需要把图片数据变形成 Mx3(M 是图片中像素点的数目)的向量。聚类完成后, 我们用聚类中心值替换与其同组的像素值,这样结果图片就只含有指定数目的颜色了。下面是代码:

import numpy as np import cv2 as cv img = cv.imread('927.jpg') Z = img.reshape((-1,3)) # convert to np.float32 Z = np.float32(Z) # define criteria, number of clusters(K) and apply kmeans() criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0) K = 8 ret,label,center=cv.kmeans(Z,K,None,criteria,10,cv.KMEANS_RANDOM_CENTERS) # Now convert back into uint8, and make original image center = np.uint8(center) res = center[label.flatten()] res2 = res.reshape((img.shape)) cv.imshow('res2',res2) cv.waitKey(0) cv.destroyAllWindows()

最新回复(0)