canvasユーザーが送信した画像を取得し、要素を介してピクセル データを取得し、何らかの処理を行ってから、ベクトル形状を使用して ( Protovisを使用して) 画像をレンダリングする Web アプリを作成しています。うまく機能していますが、最終的には数千色になり、ユーザーがターゲット パレット サイズを選択して、カラー パレットをそのサイズに縮小できるようにしたいと考えています。
色空間を縮小したい時点で、次のように RGB ピクセル データの配列を操作しています。
[[190,197,190], [202,204,200], [207,214,210], [211,214,211], [205,207,207], ...]
色から最下位ビットを削除するという素朴なオプションを試してみましたが、結果はかなり悪いものでした。色の量子化アルゴリズムについていくつかの調査を行いましたが、実装方法の明確な説明をまだ見つけていません。これをサーバーに送信し、画像処理プログラムを介して実行し、結果のパレットを返送するという厄介な方法を考え出すこともできますが、クライアント側の JavaScript で行うことをお勧めします。
ここで機能する明確に説明されたアルゴリズムの例を誰かが持っていますか? 目標は、数千色のパレットを、この特定の画像用に最適化された小さなパレットに縮小することです。
編集 (2011 年 7 月 25 日): @Pointyの提案を受けて、(ほとんどの) Leptonica の MMCQ (変更された中央値カット量子化) を JavaScript で実装しました。興味のある方は、こちらのコードをご覧ください。
編集 (2011 年 8 月 5 日): clusterfckライブラリは、これに対する別の優れたオプションのように見えます (ただし、私の実装よりも少し遅いと思います)。