web-dev-qa-db-ja.com

2つの画像が同じかどうかを知る方法は?

10000枚以上の画像があり、約2000枚が他の形式(JPEG、PNG、GIFなど)で複製されています。これらの数は両方とも毎日増加しています。これらの重複を削除する必要があるため、最初にそれらを見つける方法を知っている必要があります。

私の最初の考えは、画像のピクセルをチェックして、同じ座標に同じ色のピクセルを持つ他の写真を見つけることでした。ただし、このオプションは常に機能するとは限りません。重複を検索するとします。検索可能なオブジェクトについては、8ビットのPNGファイルを選択します。それはその画像のすべての複製を見つけますが、8ビットのPNGだけで、時には8ビットのGIFで、めったにJPEGではありません(画像がアルゴリズムだと思うので?)。

私の2番目の考えは、これらの画像をすべて複製し、厳密な2つのカラーパレット(白黒としましょう)で色を変更して、上記と同じスキャンを実行することでした。さらに、JPEG画像は、PNGまたはGIF形式とは100%似ていません(上記と同じ理由ですか?)。

3番目に考えたのは減少画像をどの程度親密にする必要があるかについてのパーセンテージと増加色がどれだけ変化し、不要な画像が削除されるかです...

何かご意見は?

21
Aistis

知覚的ハッシュが答えかもしれません:

http://www.phash.org/

知覚ハッシュは、そのコンテンツのさまざまな機能から派生したマルチメディアファイルのフィンガープリントです。入力の小さな変化が雪崩効果に依存して出力が大幅に変化する暗号化ハッシュ関数とは異なり、知覚ハッシュは、機能が類似している場合は互いに「近い」ものです。

17
Joe
  1. 寸法を確認してください。異なる場合=>画像は同じではありません。
  2. 形式を確認してください。同じ場合=>ピクセルごとに正確な比較を実行します。
  3. 異なるフォーマットがこれを行う場合:

RGB(赤、緑、青)を比較しません。明るさを重量の半分と比較し、色/色相を他の半分と比較します(2/3対1/3値の違いを計算し、「許容値」の値に応じて、それらが同じか、そうでないかを確認します。

JPEGは色情報を大幅に圧縮しますが、輝度値を損なわないようにしています。

9
Boris Yankov

数年前に大量の画像をデュープ用にスクリーニングしていたとき、すべてを8x8のサムネイルに減らし、サムネイル間の距離の2乗に基づいて類似性スコアを計算する(3色を別々に処理する)と、かなりうまくいくことがわかりました。メモリ内に8x8サムネイルの[〜#〜] lot [〜#〜]を保持できることに注意してください。

実際のコンテンツはさまざまですが、コントラストが非常に低く、全体的に類似しているいくつかの画像のみが問題であるという唯一の問題について、事実上すべての複製は非複製よりもスコアが低くなりました(いずれの場合も背景は砂浜でした)。

これは、誰かがファイルサイズを削減するために解像度または品質を下げた場合を除いて、複製された画像をキャッチするのにも効果的でした。

6
Loren Pechtel

たぶん、あなたは画像をスキャンして似ているコードを書くべきです。すべての写真をARGB形式に変換して比較できます。 (メモリ内)

考えられるアプローチは次のようになります。画像をゾーンに分割します。ゾーンの平均色や明るさをスキャンして、2つの画像の類似性を比較します。

言うまでもなく、ゾーンの90%が一致する場合は、削除候補リストに移動するゾーンを1つ選択しました。これにより、候補者のリストが作成されます。画像の縦横比を使用して、画像を水平画像と垂直画像に分類し、比較を高速化できます。このようにして、ピクセルごとに正しい色を再現しない損失のあるアルゴリズムを補正できます。あなたはプログラムを夜通し実行し、午前中にそれを実行しました:) .NETでは、これは彼のGDI + libで非常に簡単に実行できます。

1
Onno