我正在编写一个web应用程序,它接受用户提交的图像,通过canvas
元素获取像素数据,进行一些处理,然后使用矢量形状(使用Protovis)呈现图像。它工作得很好,但我最终得到了几千种颜色,我想让用户选择一个目标调色板大小,并将调色板缩小到那个大小。
在我想要减少颜色空间的时候,我正在处理一个RGB像素数据数组,如下所示:
[[190,197,190], [202,204,200], [207,214,210], [211,214,211], [205,207,207], ...]
我尝试了天真的选择,只从颜色中删除最低有效位,但结果相当糟糕。我已经做了一些关于color quantization算法的研究,但是还没有找到一个关于如何实现的明确描述。我可能会想出一种简单的方法将其发送到服务器,通过图像处理程序运行它,然后将生成的调色板发回,但我更喜欢在客户端用JavaScript来做这件事。
有没有人有一个清楚解释的算法的例子可以在这里工作?其目标是将数千种颜色的调色板减少为针对此特定图像优化的较小调色板。
编辑(7/25/11):我采纳了@Pointy的建议,并在JavaScript中实现了(大部分)Leptonica的MMCQ (改进的中值切割量化)。如果你感兴趣,你可以通过see the code here.
编辑(8/5/11): clusterfck library看起来是另一个很好的选择(尽管我认为它比我的实现慢一点)。
https://stackoverflow.com/questions/6205955
复制相似问题