1. ホーム
  2. algorithm

[解決済み] 2つの画像の類似度を測るには?[クローズド]

2022-11-17 22:06:53

質問

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

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

どのように解決するのですか?

これは、アルゴリズムにどの程度の賢さを求めるかに完全に依存します。

例えば、以下のような問題です。

  • トリミングされた画像とトリミングされていない画像の比較
  • テキストを追加した画像と、追加していない画像
  • ミラーリングされた画像

最も簡単でシンプルな アルゴリズム このために私が見たのは、各画像に対して次のステップを実行することだけです。

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

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

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

データベースで一致する可能性のあるものを調べるには、ピクセル色をデータベース内の個々の列として保存し、それらの束にインデックスを付け (ただし、非常に小さい画像を使用しない限り、すべてではない)、各ピクセル値の範囲を使用するクエリを実行します。

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