2 つの画像間の類似性を測定するにはどうすればよいですか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/25977

質問

1 つのアプリケーション (Web ページの可能性があります) のスクリーンショットと、以前に撮影したスクリーンショットを比較して、アプリケーション自体が正しく表示されているかどうかを判断したいと考えています。アスペクトがわずかに異なる可能性があるため、完全一致の比較は望んでいません (Web アプリの場合、ブラウザによっては、一部の要素がわずかに異なる場所にある可能性があります)。スクリーンショットがどの程度似ているかを示す尺度が得られます。

それをすでに行うライブラリ/ツールはありますか?どのように実装しますか?

役に立ちましたか?

解決

これは、アルゴリズムをどの程度賢くしたいかに完全に依存します。

たとえば、次のような問題があります。

  • トリミングされた画像とトリミングされていない画像
  • テキストが追加された画像と別のなし
  • 鏡像

最も簡単でシンプルな アルゴリズム これについては、各画像に対して次の手順を実行するだけであることがわかりました。

  1. 64x64 や 32x32 などの小さい値にスケールし、アスペクト比を無視し、最も近いピクセルの代わりに結合スケーリング アルゴリズムを使用します。
  2. 最も暗い色が黒になり、最も明るい色が白になるように色の範囲をスケールします。
  3. 最も明るい色が左上になり、次に右上、次に左下が暗くなるように画像を回転および反転します(もちろん可能な限り)

編集結合スケーリングアルゴリズム これは、10 ピクセルを 1 つにスケールダウンするときに、その 10 ピクセルすべての色を取得して 1 つに結合する関数を使用してそれを行うものです。平均化、平均値、または双三次スプラインなどのより複雑なアルゴリズムを使用して実行できます。

次に、2 つの画像間の平均距離をピクセルごとに計算します。

データベース内で一致する可能性のあるものを検索するには、ピクセルの色をデータベース内の個別の列として保存し、それらの束 (ただし、非常に小さな画像を使用する場合を除き、すべてではありません) にインデックスを付け、それぞれの範囲を使用するクエリを実行します。ピクセル値、つまり。小さな画像内のピクセルが、検索する画像の -5 から +5 の間にあるすべての画像。

これは実装が簡単で、実行もかなり高速ですが、当然のことながら、ほとんどの高度な違いは処理できません。そのためには、より高度なアルゴリズムが必要です。

他のヒント

これを測定する「古典的な」方法は、画像を標準的な数のセクション (10x10 グリッドなど) に分割し、各セル内の RGB 値のヒストグラムを計算し、対応するヒストグラムを比較することです。このタイプのアルゴリズムは、その単純さと、スケーリングと (小さい!) 変換に対する不変性の両方の理由から好まれます。

正規化されたカラー ヒストグラムを使用します。(アプリケーションに関するセクションをお読みください) ここ)、これらは画像検索/照合システムで一般的に使用されており、非常に信頼性が高く、比較的高速で、実装が非常に簡単な画像照合の標準的な方法です。

基本的に、カラー ヒストグラムは画像のカラー分布をキャプチャします。これを別の画像と比較して、色の分布が一致するかどうかを確認できます。

このタイプのマッチングは、スケーリング (ヒストグラムが正規化されると) や回転/シフト/移動などに対して非常に強いです。

画像がわずかに回転または移動すると、大きな差が報告される可能性があるため、ピクセルごとの比較は避けてください。

ヒストグラムは自分で生成するのが簡単です (ピクセル値にアクセスできると仮定します) が、その気がない場合は、 OpenCV ライブラリは、この種の作業を行うための優れたリソースです。 ここ は、OpenCV を使用してヒストグラムを作成する方法を示す PowerPoint プレゼンテーションです。

MPEG のようなビデオ エンコード アルゴリズムは、ビデオの各フレーム間の差分を計算してデルタをエンコードするだけではないのでしょうか?ビデオ エンコード アルゴリズムがこれらのフレームの差をどのように計算するかを調べるとよいでしょう。

このオープンソースの画像検索アプリケーションを見てください。 http://www.semanticmetadata.net/lire/. 。ここでは、いくつかの画像類似性アルゴリズムについて説明します。そのうちの 3 つは MPEG-7 標準のものです。ScalableColor、ColorLayout、EdgeHistogram、自動カラーコレログラム。

次の純粋な数学的アプローチを使用できます。 O(n^2), ただし、オフセットなどが存在しないことが確実な場合にのみ役立ちます。(ただし、均一な色のオブジェクトがいくつかある場合は、それでもかなりうまく機能します。)

とにかく、アイデアは 2 つの行列の正規化された内積を計算することです。C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

この式は実際には、行列間の角度の「余弦」です (奇妙なことに)。類似性が大きければ大きいほど(たとえば、 Pij=Qij)、C は 1 になり、それらが完全に異なる場合は、すべてについてとしましょう。 i,j Qij = 1 (ゼロ除算を避ける)、 Pij = 255, 、次にサイズについて nxn, 、 大きな方 n であればあるほど、ゼロに近づきます。(概算で: C=1/n^2).

あなたは必要になるでしょう パターン認識 そのために。2 つの画像間の小さな違いを判断するには、 ホップフィールドネット かなりうまく機能し、実装は非常に簡単です。ただし、利用可能な実装はわかりません。

Ruby のソリューションは次のとおりです。 ここで見つかりました

Readme より:

Phashion は、重複および重複に近いマルチメディア ファイルを検出する pHash ライブラリ「知覚ハッシュ」の Ruby ラッパーです。

2 つの画像間の類似性を測定する方法は、何を測定したいかによって完全に異なります。たとえば、次のようになります。コントラスト、明るさ、モダリティ、ノイズ...次に、最適な類似性尺度を選択します。からお選びいただけます 狂った (平均絶対差)、 MSD 明るさの測定に適した(平均二乗差)...もあります CR (相関係数) は、2 つの画像間の相関を表すのに適しています。次のようなヒストグラムベースの類似性尺度から選択することもできます。 SDH (差分画像ヒストグラムの標準偏差) または次のようなマルチモダリティ類似性測定 ミイラ (相互情報) または NMI (正規化された相互情報量)。

この類似性の測定には時間がかかるため、これらの測定を適用する前に画像を縮小することをお勧めします。

ある画像をもう一方の画像から減算し、その結果得られた画像を gif の jpeg として圧縮し、ファイル サイズを類似性の尺度。

2 つの同一の画像がある場合、非常によく圧縮される白いボックスが得られます。イメージが異なるほど、表現するのはより複雑になるため、圧縮可能性は低くなります。

おそらく理想的なテストではなく、おそらく必要よりもはるかに遅いですが、手早く簡単な実装として機能する可能性があります。

オープンソース ツールのコードを確認してみるとよいでしょう。 画像重複を見つける, ただし、perl で書かれているようですので、解析がどれほど簡単かはわかりません...

私が気に入った findimagedupes ページを読むと、 同じアルゴリズムの C++ 実装. 。おそらくこちらの方が分かりやすいと思います。

そして、あなたも使うことができるようです gqview.

質問に直接答えるわけではありませんが、私はこれが起こっているのを見てきました。Microsoft は最近、と呼ばれるツールをリリースしました。 フォトシンセ これは、多数の画像 (アスペクト比が異なる可能性があります) の重なり合う領域を決定するために、非常によく似た処理を行います。

彼らのブログに利用可能なライブラリやコードスニペットがあるかどうか疑問に思います。

ヴァイバブのメモをさらに拡張すると、 ハギン これはオープンソースの「自動ステッチャー」であり、問​​題についてある程度の洞察が得られるはずです。

コンテンツベースの画像検索用のソフトウェアがあり、必要なことを(部分的に)実行します。すべての参考文献と説明はプロジェクト サイトからリンクされており、短いテキストブック (Kindle) もあります。 リラ

まあ、本当に基本的な方法としては、すべてのピクセルの色を調べて、2 番目の画像の対応するピクセルの色と比較することができますが、これはおそらく非常に難しいものです。 とても 遅い解決策。

これが時々行うもので、自動化する必要がない場合は、Photoshop や Paint Shop Pro (おそらく GIMP や Paint.Net など) のレイヤーをサポートする画像エディターで実行できます。それについてはわかりません)。両方のスクリーン ショットを開き、一方をもう一方の上にレイヤーとして配置します。レイヤーのブレンド モードを [差分] に変更すると、2 つの間で同じものはすべて黒になります。最上層を移動して、配置の違いを最小限に抑えることができます。

これに続いて、Siamese Network を使用して 2 つの画像が似ているか似ていないかを確認できます。 チュートリアル. 。このチュートリアルでは、類似した画像をクラスター化しますが、次のことを使用できます。 L2 2 つの画像の類似性を測定するための距離。

比較を超えて 画像をピクセルごとに比較します。例:

enter image description here

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top