2009-11-10 8 views
5

類似のカラーパレットを持つすべての画像を、類似度が降順でソートされた選択した画像にどのように見つけ出すかは、10,000個のJPEG、PNG画像があるとしますか?Pythonで同様のカラーパレットを持つ画像を見つける

+2

可能な重複:http://stackoverflow.com/questions/593925/how-do-i-find-images-with-aこれらの他のSOの答えを見てみましょう-similar-color-using-python-and-pil – ChristopheD

+0

ええ、その質問には良い答えはありません。 :-) –

+0

多くの似たような議論があります: http://stackoverflow.com/questions/1034900/near-duplicate-image-detection/1048723#1048723 – Paul

答えて

10

各画像のカラーヒストグラムを作成します。次に、画像をコレクションに一致させたいときは、ヒストグラムが選択した画像のヒストグラムとどのくらい近いかによってリストを並べ替えるだけです。

バケットの数は、どれくらい正確であるかによって異なります。バケットを作成するために結合されたデータのタイプは、検索の優先順位をどのように定義するかを定義します。

あなたは色相の中で最も興味を持っている場合たとえば、あなたはイメージのあなたの個々のピクセルはようになりバケットを定義することができます:あなたはまた、一般的な照合をしたい場合は、することができます、

def bucket_from_pixel(r, g, b): 
    hue = hue_from_rgb(r, g, b) # [0, 360) 
    return (hue * NUM_BUCKETS)/360 

は、完全なRGB値に基づいてバケットを選択します。

PILを使用すると、組み込みのhistogram機能を使用できます。 「近さ」ヒストグラムは、任意の距離測定値を使用して計算できます。例えば、L1距離があってもよい:

hist_sel = normalize(sel.histogram()) 
hist = normalize(o.histogram()) # These normalized histograms should be stored 

dist = sum([abs(x) for x in (hist_sel - hist)]) 

L2は次のようになります

dist = sqrt(sum([x*x for x in (hist_sel - hist)])) 

Normalizeほんのいくつかの定数値(細かい1.0作品)に等しくなるようにヒストグラムの和を強制。これは、大きな画像を小さな画像と正しく比較できるようにするために重要です。 L1距離を使用する場合は、normalizeのL1測定値を使用する必要があります。 L2の場合はL2です。

+0

@Frank、あなたの助言に感謝します。 Pythonでいくつかのサンプルコードを教えてください。 PILのbuild-in histogram()関数はリストを返します。二つの画像のヒストグラムがどのくらい近いかを調べるには? – jack

+0

@Frank、10,000の候補の中から同様のヒストグラムを持つ画像を選ぶときに10,000の距離計算が必要なようですね。数値を各画像に関連付けてデータベースに格納することができるため、比較はいくつかのSQLクエリに単純化できますか? – jack

+0

@ジャック、10,000の計算は本当に高価ではありません。このようなコードを高速化する最善の方法は、ヒストグラムを整数に減らすことではなく(考えることはできませんが)、結果を単純に**キャッシュ**することです。ソート順(イメージ単位)をデータベースにキャッシュするか、メモリにキャッシュします。ヒストグラムをデータベースまたはメモリに保存して、ソート順キャッシュを再構築するのに費用がかからないようにしてください。 –

関連する問題