我正在编写一个Web应用程序,该应用程序将获取用户提交的图像,通过canvas元素获取像素数据,进行一些处理,然后使用矢量形状(使用Protovis)渲染图像。它运作良好,但最终得到了数千种颜色,我想让用户选择目标调色板的大小并将调色板减小到该大小。
canvas
在要减少色彩空间的时候,我正在处理RGB像素数据数组,如下所示:
[[190,197,190], [202,204,200], [207,214,210], [211,214,211], [205,207,207], ...]
我尝试过只从颜色中删除最低有效位的天真选项,但结果非常糟糕。我已经对色彩量化算法进行了一些研究,但是还没有找到关于如何实现它的清晰描述。我可能会想出一种巧妙的方法将其发送到服务器,通过图像处理程序运行它,然后将生成的调色板发送回去,但是我更喜欢在客户端的JavaScript中进行操作。
有没有人有一个明确解释的算法示例可以在这里工作?目标是将数千种颜色的调色板减少为针对该特定图像优化的较小的调色板。
编辑(7/25/11): 我接受 @Pointy 的建议,并在JavaScript中实现了Leptonica的MMCQ(大部分修改后的中位数切割量化)。如果您有兴趣,可以在此处查看代码。
编辑(11年8月5日): 该clusterfck库看起来像这另一个伟大的选项(虽然我认为这是一个有点慢于我的实现)。
需要说明的是,我在图像处理的任何领域都没有专门知识:我阅读了您链接的Wikipedia文章,然后从那里找到了Dan Bloomberg的Leptonica。从那里可以下载讨论和解释的算法的资源。
源代码使用C语言编写,希望它与JavaScript足够接近(至少在核心“公式”部分中),以便可以理解。“ MMCQ”算法背后的基本思想似乎并不复杂。实际上,这只是一些启发式技巧,用于根据图像中的颜色聚集在一起的方式将3维颜色空间拆分为子多维数据集。