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

Posted

技术标签:

【中文标题】如何加快openCV中的颜色聚类?【英文标题】:how to speed up color-clustering in openCV? 【发布时间】:2012-11-16 19:20:30 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

先对图像进行下采样,然后运行 ​​k-means。

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

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

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

k的小总结-意思是:

    它将每个对象(=像素)映射到最近的聚类中心(=调色板条目) 它重新计算每个调色板条目以最好地表示分配的点(= 像素) 重复直到没有任何改变为止。

所以 real 输出不是图像或图像区域。这是调色板

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

复杂性和性能:

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

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

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

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

你可以看到,最简单的方法是减少n。您可以显着减少n,为缩略图生成一个优化的调色板,然后重新运行 k-means 对整个图像细化这个调色板。由于 - 希望 - 这将显着减少迭代次数,因此有时可以很好地执行。

【讨论】:

谢谢 :) 但是在这种情况下,如何用输入图像中的新颜色替换颜色? 这仍然以相同的方式工作。将其映射到找到的最接近的颜色 k 均值。 真的吗?一个簇的掩码具有原始图像大小的 1/2。如果我调整蒙版的大小,我认为结果不准确,因为它会覆盖原始图像上的相邻像素。 哪个面具?使用 k-means 聚类中心(=新调色板)。将每个像素映射到最接近的颜色。【参考方案2】:

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

    将图像调整为更小的图像(实际上已经建议) 颜色数量减少 (image quantization)。我按照这里的建议做了:How to reduce the number of colors in an image with OpenCV?。

这确实帮助我在某些时候加速了集群化。您也可以尝试使用 OpenCV 的mean-shift filtering。

【讨论】:

其实他想用k-means进行颜色量化。为什么要先使用量化 A 再运行量化 B?请注意,他不是对图像进行聚类,而是对颜色进行聚类。 @Anony-Mousse 你说quantization AB是什么意思? 见en.wikipedia.org/wiki/Color_quantization -- k-means 可以用于颜色量化,这可能是他正在尝试做的事情。之前使用不同的颜色量化是没有意义的,不是吗? @Anony-Mousse 它将提高速度 - kmeans 在较少的颜色上工作得更快。 K-means 复杂度是O(n k i),其中n 是像素数,k 是聚类数,i 是直到收敛的迭代次数。当然:如果你对图像进行了很多预量化,k-means 可能需要更少的迭代,但它也会更多地降低质量。您是否有任何参考资料表明您应该预先量化 k-means?【参考方案3】:

您需要为每个数据分配一个权重,即直方图 bin 中的值的数量。然后,当您计算集群质心的新值时,您使用加权平均值而不是普通平均值。但是 OpenCV KMeans 聚类的接口不支持加权值。您可以使用支持它的C clustering library,它有很好的文档记录(尽管从生物信息学中获取示例),并且易于集成(单个 .h/.c 文件)。

【讨论】:

以上是关于如何加快openCV中的颜色聚类?的主要内容,如果未能解决你的问题,请参考以下文章

opencv:如何使用kmeans()按角度聚类

记录一次c++实现图片颜色聚类的小需求

OpenCV:iOS中的k-means聚类

如何使用 OpenCV 减少图像中的颜色数量?

如何在 WSL2 上使用 OpenCV 加快 C++ 项目的构建速度? [关闭]

如何使用 OpenCV Python 检测颜色