为啥使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?

Posted

技术标签:

【中文标题】为啥使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?【英文标题】:Why would an image clustered to two segments using k-means (from Scipy) show more than two different pixel values?为什么使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值? 【发布时间】:2021-12-17 17:19:56 【问题描述】:

我正在使用 Python 的 Scikit Learn 库提供的 KMeans 聚类来分割彩色图像。因为我只需要绿色通道,所以我将其他两个通道设置为零。 从肘部图中,我发现两个集群对于图像是最佳的。 现在,当我进行聚类时,分割图像中存在两个以上的像素值。这怎么可能?我认为像 KMeans 这样的分割实际上最终只保留了两个集群。 任何帮助表示赞赏。谢谢。

【问题讨论】:

请显示您使用的代码,不清楚您是如何获得输出图像的。见minimal reproducible example。 image2 = image.reshape((-1,3)) 987654325 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 1.0) 987654327 number_of_runs = 10 987654329 center = np.uint8(center) res = center[label.flatten()] 987654332 print(center) cv2.imwrite('NJ_G_03_09_100X_green_channel_6p5_segmented2iter100.jpg', res2) span> 对不起,我看不懂。请edit您的问题进行修改,cmets 不提供重要信息。另外,请包含导入语句,以便我们查看您使用的模块。 我注意到的一件事是您使用了cv2.kmeans,它不是来自 Scikit Learn,而是来自 OpenCV。所有这些细节都非常重要,因此请确保您的描述与您所做的相符。 PNG 看起来不错,谢谢。 【参考方案1】:
class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='auto')

根据 Scikit Learn 的文档 1,您应该决定您的 K-Means 模型输出多少个集群。

如果您不确定集群的数量,也许您可​​以尝试分层集群2。

【讨论】:

我选择了簇数为2,然后进行了分割。我的问题是关于具有两种以上像素值的最终图像。 我选择了簇数为2,然后进行了分割。我的问题是关于具有两种以上像素值的最终图像。例如,假设我有一个绿色图像,其区域的像素值 = 180 +- 10,另一个区域的像素值为 250 +- 10。因此,我希望最终图像仅具有 180 个区域和 250 个区域。除了 180 或 250 之外,没有其他数字。但这不是输出的样子,它再次包含 182、185、179、256、248……为什么会发生这种情况?我希望这个问题现在很清楚了。 抱歉造成误会,您是否尝试增加“max_iter”参数?因为 K-Means 需要足够的迭代来最小化惯性。 这也可以帮助您更好地了解 K-means 的作用 1 是的,我已经尝试将迭代次数提高到 100 次,但并没有解决问题。

以上是关于为啥使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?的主要内容,如果未能解决你的问题,请参考以下文章

python 使用Scipy k-means进行聚类,使用简单的欧几里德距离

使用 K-Means 聚类时,为啥我的数据点不在正确准确的聚类中?

K-Means - 为啥最佳聚类数随轮廓分析而变化?

为啥当我用 K-means 进行 4 个聚类时,我只有一个惯性而不是 4 个?

为啥 k-means 聚类散点图显示不同的结果?

为啥权重不会改变 sci-kit 学习包中的 K-mean 聚类中心位置?