为啥使用 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 聚类时,为啥我的数据点不在正确准确的聚类中?