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


94

1つのアプリケーション(Webページの場合もある)のスクリーンショットを以前に撮ったスクリーンショットと比較して、アプリケーションが正しく表示されているかどうかを確認します。アスペクトが少し異なる可能性があるため、完全一致の比較は必要ありません(Webアプリの場合、ブラウザーによっては、一部の要素が少し異なる場所にある可能性があります)。スクリーンショットがどの程度類似しているかの目安になります。

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


1
この他の同様の問題のいくつかの良い答えがあります。 stackoverflow.com/questions/75891/...
BLAK

1
そして、もっとここに:stackoverflow.com/questions/189943/...
Anoyz

1
機械学習、より具体的には「ディープラーニング」の最近の進歩を踏まえて、回答を更新する時間です。
jldupont 2016

:私の研究室は、ここで説明しすぎて、この問題を解決するために必要な、およびワークフローを使用douglasduhaime.com/posts/...
duhaime

回答:


73

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

たとえば、いくつかの問題があります:

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

これについて私が見た最も簡単で単純なアルゴリズムは、各画像に対して次の手順を実行することです。

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

編集 A 組み合わせるスケーリングアルゴリズムは、 1に10個のピクセルを縮小する場合は1にすべてのものを10個のピクセル、コンバインそれらの色を取る関数を使用してそれを行うだろうということです。平均化、平均値、またはバイキュービックスプラインなどのより複雑なアルゴリズムなどのアルゴリズムで実行できます。

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

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

これは実装が簡単で、実行もかなり高速ですが、もちろんほとんどの高度な違いには対応できません。そのためには、はるかに高度なアルゴリズムが必要です。


14
「結合スケーリングアルゴリズム」とは何ですか?
グレッグリンド

32

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


6
これは、画像全体に対して単一のヒストグラムを作成することと似ていませんか?ただし、ミラーリングや回転に弾力性がないという追加の欠点がありますか?
dodgy_coder

画像の2つの半分からの2つのヒストグラムは、全体の1つのヒストグラムよりも一致精度が高くなります。あなたが述べた欠点がありますが、それはあなたが解決している問題に依存します。
psycho brm

25

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

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

このタイプのマッチングは、スケーリング(ヒストグラムが正規化された後)、および回転/シフト/移動などに対して非常に弾力性があります。

ピクセルごとの比較は避けてください。イメージが少し回転/シフトされたかのように報告されると、大きな違いが報告される可能性があります。

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


14

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

このオープンソースの画像検索アプリケーションhttp://www.semanticmetadata.net/lire/をご覧ください。いくつかの画像類似性アルゴリズムについて説明します。そのうち3つは、MPEG-7標準からのものです。ScalableColor、ColorLayout、EdgeHistogram、およびAuto Color Correlogramです。


1
これはここでの質問に答えません。問題は、ピクセルごとの比較ではありません。
Kousha

@Kousha確かに、それでも思考の興味深い方向性。
意味の問題

13

の純粋な数学的アプローチを使用することもできますが、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



7

ルビーの解決策はここにあります

Readmeから:

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


5

2つの画像間の類似性を測定する方法は、たとえば、コントラスト、明るさ、モダリティ、ノイズなど、測定するものに完全に依存します。次に、最適な類似性測定を選択します。明るさの測定に適したMAD(平均絶対差)、MSD(平均二乗差)から選択できます。2つの画像間の相関を表すのに適したCR(相関係数)もあります。また、SDH(差分画像ヒストグラムの標準偏差)などのヒストグラムベースの類似性メジャー、またはMI(相互情報)またはNMI(正規化された相互情報)などのマルチモダリティ類似性メジャーから選択することもできます。

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


4

ある画像を別の画像から差し引いて、結果の画像をgifのjpegとして圧縮し、ファイルサイズを類似性の尺度。

同一の画像が2つある場合は、白いボックスが表示され、圧縮率は非常に高くなります。画像が異なるほど、表現が複雑になり、圧縮率が低下します。

おそらく理想的なテストではなく、おそらく必要以上に遅くなりますが、迅速でダーティな実装として機能する可能性があります。


90度回転することを考えてください。画像はまだ似ています。
意味に関する事項

3

オープンソースツールfindimagedupesのコードを見るかもしれませんが、perlで記述されているように見えるため、解析がいかに簡単かはわかりません...

私が気に入ったfindimagedupesページを読んだところ、同じアルゴリズムのC ++実装があることがわかりました。おそらくこれは理解しやすいでしょう。

また、gqviewも使用できるようです


2

さて、あなたの質問に直接答えないでください、しかし私はこれが起こるのを見ました。マイクロソフトは最近、PhotoSynthと呼ばれるツールをリリースしました。このツールは、非常によく似た処理を行って、多数の画像(縦横比が異なる可能性がある)の重複領域を特定します。

彼らは彼らのブログに利用可能なライブラリやコードスニペットを持っているのだろうか。


1
この技術。廃止されました。
ジョセフロッソン2017

2

Vaibhavの注釈を拡張すると、huginはオープンソースの「自動縫い手」であり、問​​題についてある程度の洞察が必要です。


2

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


1

このチュートリアルに従って、シャムネットワークを使用して、2つの画像が類似しているかどうかを確認できます。このチュートリアルでは類似した画像をクラスター化しますが、L2距離を使用して2つの画像の類似性を測定できます。


0

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


このタイプの差分を非常に簡単にする別のツールはkaleidoscopeapp.comです
Michael Osofsky

0

Beyond Compareには、画像のピクセルごとの比較があります。たとえば、

ここに画像の説明を入力してください


@ xilpex、OPは尋ねます:すでにそれを行うライブラリ/ツールはありますか?私の回答には、そのようなライブラリ/ツールへのリンクが含まれています。
emallove

-1

さて、使用する本当に基本レベルの方法は、すべてのピクセルカラーを通過して、2番目の画像の対応するピクセルカラーと比較することができますが、これはおそらく非常非常遅いソリューションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.