【问题标题】:Algorithm for color quantization/reduced image color palette in JavaScript? [closed]JavaScript中颜色量化/减少图像调色板的算法? [关闭]
【发布时间】: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


【解决方案1】:

需要注意的是,我在图像处理的任何领域都没有任何专业知识:我阅读了您链接的 Wikipedia 文章,并从那里找到了 Dan Bloomberg 的 Leptonica。从那里你可以download讨论和解释的算法的来源。

源代码用 C 语言编写,希望它与 JavaScript 足够接近(至少在核心“公式”部分)可以理解。 “MMCQ”算法背后的基本思想似乎并不复杂。这实际上只是一些启发式技巧,可根据图像中颜色聚集在一起的方式将 3 维颜色空间拆分为子立方体。

【讨论】:

  • 嗯,我希望有一些伪代码或我知道的语言的东西 - 但看起来我现在有一个周末编码项目:)。
  • 这里面有什么东西吗?我正在寻找类似的东西。
【解决方案2】:

我编写了一个从图像中提取调色板的网络应用程序。它允许您加载图像,然后使用三种不同的算法/方法从中提取调色板:

  1. 简单直方图
  2. 中切
  3. k 均值

你可以找到运行here的副本

你可以在github找到它的代码

它 100% 用 Ja​​vascript 编写,示例图使用 Plotly.js

我还写了一篇文章更详细地描述了这三种方法/算法 - 你可以找到here

【讨论】:

  • 酷,感谢发帖!
猜你喜欢
  • 2016-04-06
  • 2014-03-18
  • 2013-10-23
  • 2021-11-11
  • 2020-07-23
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2013-01-15
相关资源
最近更新 更多