2012-04-29 8 views
4

イメージに適用する「単純な」カラーリダクションを調べ始めます。私は最後の日にこの仕組みを研究し、ここで実験するためのまともなアルゴリズムであると思われるものを見つけました:Median cut algorithmメディアンカットカラー縮小アルゴリズムの出力パレットをソースイメージに適用する

出力はn色のパレットです。私はまだこのアルゴリズムが実際に動作することを確認する必要がありますが、私はそれを仮定しています。私がしたいのは、その出力を取り出し、それをパレットが生成されたイメージに適用することです。

画像には色の圧縮形式や深い知識があるとは言えませんが、どのように画像フォーマットで始めなくてもパレットを適用できるのでしょうか?インデックス付きパレット(GIF)を使用します。

私は、各ピクセルについて、現在のピクセルの色とパレットの各色の差を計算し、そのピクセルを最小の差のパレット色で置き換えることを考えています。これはアプローチするための実行可能な方法でしょうか?

注 - 私はさまざまなライブラリ(ImageMagick)を調べましたが、これらはやや不満のようです。私が画像操作でやっていることのほとんどは、カラーパレットを減らすことになります。これ以上の複雑さはありません。だから私はこのアルゴリズムを実装することが私のニーズにとって最も簡単なアプローチになると思っています。

+0

- このアルゴリズムは、Qtのに完全に統合され、素晴らしい作品。それを動作させるにはゼロの変更が必要です。 – giraffee

+0

Median Cutでプレイしたい場合は、既存の実装を微調整することができます:https://github.com/pornel/improved-pngquant/(それは速い再マッピングとPNGサポートを持っています) – Kornel

答えて

1

私はその実行可能な方法だと思います。あなたが計算する違いはユークリッドの違いであるべきですhere しかし、あなたは少し最適化を行うことができます。毎回新しい差異を計算する必要はありません。たとえば、ルックアップテーブルを作成して、それを計算済みの場合は適切な色を直接使用することができます。

+0

素晴らしい - 私は気づいたwiki読書ルックアップテーブルを提案してくれてありがとう - 私はそれを考えなかった。 – giraffee

2

最速の方法は、カラールックアップのためにオクトツリーを使用することです。

考えられるのは、すべてのパレットカラーインデックスをオクトツリーに追加し、ルートノードに最も近い色を求めることです。最も近い色を要求されると、各ノード(パレットにアクセス可能)は、それが最も深いレベルにある場合には独自のカラーインデックスを返し、最も近いカラーインデックスについては対応する子に(要求された色に)尋ねます。対応する子がない場合は、すべての子に最も近いカラーインデックスを要求し、色が最も小さいものを返します。

基本的に、オクトツリーは距離比較の回数を大幅に最小限に抑えるでしょう。これは、すべての距離を事前に計算することによって高速化されます。ここで

は私の実装です...任意の仲間のQtユーザーのためだけFYI http://www.codeproject.com/Tips/1046574/OctTree-Based-Nearest-Color-Search