1

基于该cv2.kmeans函数,我编写了一个函数“F(Image)”,输出为“label”。

ret,label,center=cv2.kmeans(Image,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

F(Image) 的输出,“label”,稍后用于其他图像处理。

但是,我需要为大量图像运行 F(Image)。我注意到,如果我连续运行 F(Image1) 和 F(Image2) 与分别运行 F(Image1) 和 F(Image2),标签是不同的。

我的怀疑是每次cv2.KMEANS_RANDOM_CENTERS运行时,它都以不同的随机数开始。

不进入源代码cv2.KMEANS_RANDOM_CENTERS,有没有什么办法可以保证每次运行代码时标签都是一样的?或者运行 F(Image1) 和 F(Image2),因为它们是分开运行的。

4

2 回答 2

2

cv2.kmeans()采用 2 种标志:cv2.KMEANS_PP_CENTERScv2.KMEANS_RANDOM_CENTERS.

cv2.KMEANS_RANDOM_CENTERS:

启用此标志后,该方法总是从一组随机的初始样本开始,并尝试从那里收敛,具体取决于您的TermCirteria.

优点:

  • 节省计算时间。

缺点:

  • 不保证完全相同的图像具有相同的标签。

cv2.KMEANS_PP_CENTERS:

启用此标志后,该方法首先迭代整个图像以确定可能的中心,然后开始收敛。

优点:

  • 将为相同的输入图像产生最佳和一致的结果

缺点:

  • 需要额外的计算时间来迭代所有像素并确定可能的样本。

注意:我还阅读了另一个标志cv::KMEANS_USE_INITIAL_LABELS,您可以使用它传递自定义样本,该方法用于收敛,但是在链接的文档中,没有提到该标志,不确定它是否已被弃用或文档是未更新。

于 2017-06-08T03:55:23.183 回答
1

该方法仅在每次迭代后保留最佳标签。因此,如果您设置的迭代次数足够高,比如说cv2.kmeans(Image,K,None,criteria,100,cv2.KMEANS_RANDOM_CENTERS),输出结果将是相似的。

于 2018-05-15T02:28:34.647 回答