【发布时间】:2011-09-06 13:12:58
【问题描述】:
我正在编写一个网络应用程序,它获取用户提交的图像,通过canvas 元素获取像素数据,进行一些处理,然后使用矢量形状(使用Protovis)渲染图像。它工作得很好,但我最终有几千种颜色,我想让用户选择一个目标调色板大小并将调色板缩小到那个大小。
在我想减少色彩空间的时候,我正在处理一组 RGB 像素数据,如下所示:
[[190,197,190], [202,204,200], [207,214,210], [211,214,211], [205,207,207], ...]
我尝试了从颜色中删除最低有效位的简单选项,但结果非常糟糕。我对color quantization 算法进行了一些研究,但还没有找到关于如何实现算法的清晰描述。我可能会想出一种笨拙的方式将它发送到服务器,通过图像处理程序运行它,然后将生成的调色板发送回来,但我更喜欢在客户端用 JavaScript 来完成。
有没有人有一个可以在这里工作的清晰解释的算法的例子?目标是将数千种颜色的调色板缩减为针对此特定图像优化的较小调色板。
编辑(2011 年 7 月 25 日):我接受了 @Pointy 的建议,并在 JavaScript 中实现了(大部分)Leptonica 的 MMCQ(修正中值切割量化)。有兴趣的可以see the code here.
编辑(2011 年 8 月 5 日):clusterfck library 看起来是另一个不错的选择(尽管我认为它比我的实现要慢一些)。
【问题讨论】:
-
也许您可以使用 6 位或 4 位值对实际颜色进行分组,而不是仅仅删除一些位并保留它。一旦确定了组,您就可以计算每个组的所有实际成员的平均值(或中位数或其他)。 (请注意,我对图像处理理论几乎一无所知:-)
-
...哈哈,我输入的是“算法”下的第一段所说的,差不多:-)
-
@Pointy - 是的 :)。我希望有人可以为此提供一个好的算法 - 我知道基本思想是“集群,然后取每个集群的平均值”,但我对如何进行集群有点茫然。
-
我点击了维基百科页面上的一些链接,发现Leptonica 提供了“MMCQ”(“修改的中值切割量化”)算法(C 语言)。它看起来并不简单,但代码的注释很好,基本思想似乎很容易理解(即,没有深奥的月球数学或任何东西)。
-
我不懂 C,所以我担心这可能需要大量的挖掘。不过,请随时重新发布作为答案,所以我至少可以给你一个 +1 - 看起来是一个很好的调查选择。
标签: javascript algorithm colors palette