2011-01-04 18 views
4

cngを使用してpng画像ファイルで最も一般的な色を取得する必要があります。これは、イメージに含まれる同様の色のテキストを描画できるようにするためです。PNGで最も使用される色を取得

+2

PNGに白いピクセルしか含まれていない場合は、テキストを白で描画しますか?あなたはそれがあなたが望んでいると確信していますか? –

+2

@Doc Brownどこで彼はイメージを描いていたと言いましたか? – Jess

+0

平均色のようなものではなく、最も一般的な色が本当に欲しいですか?おそらく光学的に共通の色は多くのわずかに異なる色から構成されているので、多くの異なる色があり、最も一般的な色は画像の小さな部分のみを満たすことがあります。おそらく、ヒストグラムを作成する前に、カラーチャネルごとにわずかな値に色を分別する必要があります。 – CodesInChaos

答えて

0

多分あなたのためにそれを行うライブラリがありますが、そうでない場合は、すべてのピクセルを循環させて、出現回数で見つけたすべての色のマップを作成し、最後にそれが最も使用されています。

4

colour histogramを使用して、RGBまたはHSV(色空間に応じて)の値をカテゴリにサンプリングすることができます。しかし、ほとんどの色を実際の値で識別したい場合は、各色の出現を別々に数えなければなりません。全ての画素を

SortedDictionary<Color,int>

とループ:あなたは、実際のピクセル値を見ている場合

0

は、私がソートされた辞書を使用すると思います。ピクセルをループする方法がわからない場合は、Bitmap.LockBitsをご覧ください。あなたの目的のために、GetPixelが遅すぎるでしょう。

編集:

私はソートについて100%確信していません。私はCodeInChaosに同意します - まっすぐな辞書はとにかく高速になりそうです。あなたは、最も一般的な価値を得るために、辞書を一回ループする必要があります。

+1

辞書の代わりにSortedDictionaryを使用するのはなぜですか?ソートは、Comparerを手動で提供せずにColor構造体でも機能しますか?また、Dictinaryはおそらく高速です。なぜなら、バイナリ検索の代わりにハッシュテーブルルックアップを行うだけでよいからです。 – CodesInChaos

+0

私はもともとDictionaryをタイプしていましたが、色が自動的に並べ替えるとすばらしいと思っていました。これで、ソートはうまくいかないかもしれませんが、各色のカウントが得られます。速度についての良い点、しかし。私はそれを編集します。 –

0

ヒストグラムアルゴリズムで各色を数えることができますが、それはおそらくではなく、です。非常に似ている色は一緒に数える必要があります。

Octree Color Quantizationを使用することをお勧めします。Octree Color Quantizationは、自動的に色の数を減らして同様の色を単一のバケットにグループ化します。アルゴリズムの説明:http://www.cubic.org/docs/octree.htm

このアドバイスは24ビットPNGのみです。 8ビットPNGの場合は、すでにカラーグループ化を行うパレットがあります。 256値のテーブルを作成し、遭遇したときに各パレットインデックスの数をカウントするだけで済みます。

関連する問題