我试图使用KMeans对RGB颜色进行聚类,并自动计算图像中每个组的像素数量。为此,我将质心的初始位置设置为我希望分类的位置,并从sklearn运行KMeans。
问题是,根据图像的不同,算法输出的初始质心向量的顺序会发生变化,所以当我计算元素数量时,它会对应到错误的颜色。
这种情况通常发生在我图像中没有一个或多个初始质心颜色的时候。在这种情况下,我希望它计算为0。
有谁知道如何在KMeans预测输出中固定初始质心的顺序吗?
代码如下:
centroid_start = np.array([[0,0,0],#Black [38,64,87], #Col1 [43,68,98], #Col2 [23,42,45], #Col3 [160, 62, 0],#Col3 [153, 82, 33], #Col5 [198, 130, 109], #Col6 [100,105,79], #Col7 [220,138, 22]#Col8 ], np.float64) image = cv.cvtColor(img, cv.COLOR_HSV2RGB) reshape=image.reshape((image.shape[0]*image.shape[1], 3)) cluster = KMeans(n_clusters =np.shape(centroid_start[0], init =centroid_start).fit(reshape) pixels = Counter(cluster.labels_)print(pixels)
问题是:当我检查’pixels’变量时,0并不总是对应黑色,1并不总是对应Col1,依此类推。
回答:
如果你不希望颜色发生迁移,可能不应该使用k-means。相反,只需使用成对距离来计算你的颜色与图像像素之间的距离,然后选择距离最小的颜色。
如果你确实希望初始颜色发生迁移,那么你必须接受你的某些初始聚类中心(颜色)可能会消失,或者可能迁移到与你初始颜色非常不同的状态。一个选项是重新排序你的已拟合的KMeans对象的cluster_centers_
属性(以及可能的labels_
)的行。另一个可能更安全的选项是计算拟合的聚类中心与你的原始颜色的映射(再次使用成对距离),然后转换你后续k-means分类的结果。如果你想一步完成,你可以子类化KMeans
或通过创建你自己的从BaseEstimator派生的类来包装它。