对于一个项目,我想实现一种颜色聚类算法,用类似于聚类的平均颜色替换相似的颜色。
目前,我使用kmeans算法聚类整个图像。但这需要很长时间。有人知道如何使用kmeans聚类颜色直方图,所以我可以执行这个算法吗?
答案 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的复杂度为O(n*k*i)
,其中n
是您拥有的像素的数量, k 所需的输出数量颜色和 i 收敛前所需的迭代次数。
n
:通过下采样,您可以轻松减少n
,这是最大因素。在许多情况下,在看到性能下降之前,可以非常显着地减少这种情况。
k
:这是您想要的输出颜色数。是否可以减少这种情况取决于您的实际使用情况。
i
:各种因素会对收敛产生影响(包括其他因素!),但最强的可能是具有良好的起始值。因此,如果您有一个非常快但质量低的方法来选择调色板,请先运行它,然后使用k-means来优化此调色板。也许OpenCV已经包含了适当的启发式算法!
您可以看到,最简单的方法是减少n
。您可以显着减少n
,为缩略图生成优化的调色板,然后重新运行 k-means在完整图像上 refinining this调色板。正如 - 希望 - 这将显着减少迭代次数,这有时可以很好地执行。
答案 1 :(得分:1)
我的答案与直方图聚类无关,但最近我需要加速算法的聚类过程。为此我做了以下事情:
这确实帮助我在某些时候加速了群集化。您也可以尝试使用OpenCV的mean-shift filtering。
答案 2 :(得分:0)
您需要为每个数据指定权重,即直方图箱中的值数。然后,当您为群集质心计算新值时,使用加权平均值而不是普通平均值。但是OpenCV KMeans集群的界面不支持加权值。你可以使用支持它的C clustering library,有很好的文档记录(虽然从生物信息学中得到例子),并且易于集成(单个.h / .c文件)。