1つのアプリケーション(Webページの場合もある)のスクリーンショットを以前に撮ったスクリーンショットと比較して、アプリケーションが正しく表示されているかどうかを確認します。アスペクトが少し異なる可能性があるため、完全一致の比較は必要ありません(Webアプリの場合、ブラウザーによっては、一部の要素が少し異なる場所にある可能性があります)。スクリーンショットがどの程度類似しているかの目安になります。
すでにそれを行うライブラリ/ツールはありますか?どのように実装しますか?
1つのアプリケーション(Webページの場合もある)のスクリーンショットを以前に撮ったスクリーンショットと比較して、アプリケーションが正しく表示されているかどうかを確認します。アスペクトが少し異なる可能性があるため、完全一致の比較は必要ありません(Webアプリの場合、ブラウザーによっては、一部の要素が少し異なる場所にある可能性があります)。スクリーンショットがどの程度類似しているかの目安になります。
すでにそれを行うライブラリ/ツールはありますか?どのように実装しますか?
回答:
これは、アルゴリズムをどの程度スマートにしたいかに完全に依存します。
たとえば、いくつかの問題があります:
これについて私が見た最も簡単で単純なアルゴリズムは、各画像に対して次の手順を実行することです。
編集 A 組み合わせるスケーリングアルゴリズムは、 1に10個のピクセルを縮小する場合は1にすべてのものを10個のピクセル、コンバインそれらの色を取る関数を使用してそれを行うだろうということです。平均化、平均値、またはバイキュービックスプラインなどのより複雑なアルゴリズムなどのアルゴリズムで実行できます。
次に、2つの画像間の平均距離をピクセルごとに計算します。
データベースで一致の可能性を調べるには、ピクセルの色をデータベースの個別の列として保存し、それらの束にインデックスを付けます(非常に小さな画像を使用しない限り、すべてではありません)。それぞれに範囲を使用するクエリを実行します。ピクセル値、つまり 小さな画像のピクセルが、検索したい画像の-5から+5の間のすべての画像。
これは実装が簡単で、実行もかなり高速ですが、もちろんほとんどの高度な違いには対応できません。そのためには、はるかに高度なアルゴリズムが必要です。
これを測定する「古典的な」方法は、画像をいくつかの標準的な数のセクション(たとえば、10x10グリッド)に分割し、各セル内のRGB値のヒストグラムを計算し、対応するヒストグラムを比較することです。このタイプのアルゴリズムは、その単純さと、スケーリングおよび(小さい!)変換に対する不変性の両方のため、推奨されます。
正規化された色ヒストグラムを使用します。(ここのアプリケーションに関するセクションをお読みください)、それらは画像検索/マッチングシステムで一般的に使用され、非常に信頼性が高く、比較的高速で、実装が非常に簡単な画像マッチングの標準的な方法です。
基本的に、色ヒストグラムは画像の色分布をキャプチャします。次に、これを別の画像と比較して、色分布が一致するかどうかを確認できます。
このタイプのマッチングは、スケーリング(ヒストグラムが正規化された後)、および回転/シフト/移動などに対して非常に弾力性があります。
ピクセルごとの比較は避けてください。イメージが少し回転/シフトされたかのように報告されると、大きな違いが報告される可能性があります。
ヒストグラムは自分で生成するのは簡単です(ピクセル値にアクセスできると仮定した場合)が、気に入らない場合は、OpenCVライブラリがこの種のことを行うための優れたリソースです。これは、OpenCVを使用してヒストグラムを作成する方法を示すパワーポイントプレゼンテーションです。
MPEGのようなビデオエンコーディングアルゴリズムは、ビデオの各フレーム間の差分を計算して、デルタをエンコードできるようにしないのですか?ビデオエンコーディングアルゴリズムがこれらのフレームの違いをどのように計算するかを調べてみてください。
このオープンソースの画像検索アプリケーションhttp://www.semanticmetadata.net/lire/をご覧ください。いくつかの画像類似性アルゴリズムについて説明します。そのうち3つは、MPEG-7標準からのものです。ScalableColor、ColorLayout、EdgeHistogram、およびAuto Color Correlogramです。
の純粋な数学的アプローチを使用することもできますが、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つの画像間のわずかな違いを判断するために、Hopfieldネットはかなりうまく機能し、実装は非常に簡単です。ただし、利用可能な実装はわかりません。
2つの画像間の類似性を測定する方法は、たとえば、コントラスト、明るさ、モダリティ、ノイズなど、測定するものに完全に依存します。次に、最適な類似性測定を選択します。明るさの測定に適したMAD(平均絶対差)、MSD(平均二乗差)から選択できます。2つの画像間の相関を表すのに適したCR(相関係数)もあります。また、SDH(差分画像ヒストグラムの標準偏差)などのヒストグラムベースの類似性メジャー、またはMI(相互情報)またはNMI(正規化された相互情報)などのマルチモダリティ類似性メジャーから選択することもできます。
この類似性の測定には時間がかかるため、これらの測定を適用する前に画像を縮小することをお勧めします。
オープンソースツールfindimagedupesのコードを見るかもしれませんが、perlで記述されているように見えるため、解析がいかに簡単かはわかりません...
私が気に入ったfindimagedupesページを読んだところ、同じアルゴリズムのC ++実装があることがわかりました。おそらくこれは理解しやすいでしょう。
さて、あなたの質問に直接答えないでください、しかし私はこれが起こるのを見ました。マイクロソフトは最近、PhotoSynthと呼ばれるツールをリリースしました。このツールは、非常によく似た処理を行って、多数の画像(縦横比が異なる可能性がある)の重複領域を特定します。
彼らは彼らのブログに利用可能なライブラリやコードスニペットを持っているのだろうか。
これがたまに行う作業であり、自動化する必要がない場合は、PhotoshopやPaint Shop Proなどのレイヤーをサポートする画像エディターで実行できます(おそらくGIMPまたはPaint.Netでも可能ですが、私はmわからない)。両方のスクリーンショットを開き、一方をもう一方の上にレイヤーとして配置します。レイヤーの描画モードを差分に変更すると、2つの間で同じものはすべて黒になります。最上層を移動して、配置の違いを最小限に抑えることができます。
Beyond Compareには、画像のピクセルごとの比較があります。たとえば、