如何加速openCV中的颜色聚类?

时间:2012-11-28 20:10:21

标签: opencv cluster-analysis data-mining k-means image-segmentation

对于一个项目,我想实现一种颜色聚类算法,用类似于聚类的平均颜色替换相似的颜色。

目前,我使用kmeans算法聚类整个图像。但这需要很长时间。有人知道如何使用kmeans聚类颜色直方图,所以我可以执行这个算法吗?

3 个答案:

答案 0 :(得分:5)

首先

下采样图像,然后运行k-means。

如果你在x和y中将图像的大小调整为1/2,它不应该影响很多颜色,但k-means应该最多占用1/4的时间。如果你重新采样到宽度和高度的1/10,k-means的运行速度应该快100倍。

https://en.wikipedia.org/wiki/Color_quantization

通过对图像进行下采样,您可以在群集期间处理较少的“像素”。但最终,它应该产生大致相同的配色方案。

k -means的小摘要:

  1. 它将每个对象(=像素)映射到最近的聚类中心(=调色板条目)
  2. 重新计算每个调色板条目以最佳地表示指定的点(=像素)
  3. 重复,直到没有任何变化。
  4. 因此真实输出不是图像或图像区域。这是调色板

    然后,只需用最接近的颜色替换每个像素,就可以将任意图像(包括全分辨率版本)映射到此调色板!

    复杂性和性能:

    k-means的复杂度为O(n*k*i),其中n是您拥有的像素的数量, k 所需的输出数量颜色和 i 收敛前所需的迭代次数。

    n:通过下采样,您可以轻松减少n,这是最大因素。在许多情况下,在看到性能下降之前,可以非常显着地减少这种情况。

    k:这是您想要的输出颜色数。是否可以减少这种情况取决于您的实际使用情况。

    i:各种因素会对收敛产生影响(包括其他因素!),但最强的可能是具有良好的起始值。因此,如果您有一个非常快但质量低的方法来选择调色板,请先运行它,然后使用k-means来优化此调色板。也许OpenCV已经包含了适当的启发式算法!

    您可以看到,最简单的方法是减少n。您可以显着减少n,为缩略图生成优化的调色板,然后重新运行 k-means在完整图像上 refinining this调色板。正如 - 希望 - 这将显着减少迭代次数,这有时可以很好地执行。

答案 1 :(得分:1)

我的答案与直方图聚类无关,但最近我需要加速算法的聚类过程。为此我做了以下事情:

  1. 将图片大小调整为较小的图像(实际上已经建议)
  2. 减少颜色数量(image quantization)。我按照这里的建议做到了:How to reduce the number of colors in an image with OpenCV?
  3. 这确实帮助我在某些时候加速了群集化。您也可以尝试使用OpenCV的mean-shift filtering

答案 2 :(得分:0)

您需要为每个数据指定权重,即直方图箱中的值数。然后,当您为群集质心计算新值时,使用加权平均值而不是普通平均值。但是OpenCV KMeans集群的界面不支持加权值。你可以使用支持它的C clustering library,有很好的文档记录(虽然从生物信息学中得到例子),并且易于集成(单个.h / .c文件)。