2 つの画像を比較して、それらが 100% 類似しているか、色やトリミングのみが変更されているかを判断するにはどうすればよいですか?
3 に答える
抽象的に言えば、2 つの画像を比較する類似度関数を定義する必要があります。画像が「100% 類似」(等しい) かどうかを判断するには、次の操作を実行できます。
- 画像の大きさを比較
- 画像サイズが同じ場合は、単純にピクセルを互いに減算します
if ( sum( abs( pixel_1_i - pixel_2_j ) ) / num_pixels < threshold ) return true
画像の色が違う、トリミングされている場合
- 両方の画像にエッジ検出器を適用する
- 相互相関を計算する (周波数領域、FFT)
- 最高峰を見つける
- (小さい) エッジ マップを決定された位置に配置する
- 絶対誤差を計算する
if (error < threshold) return true
ところで:画像が拡大縮小または回転されている場合、このアプローチは機能しません。
さらなる研究:
以下は問題に対するかなり単純化されたアプローチであり、わずかに異なる角度から撮影された同じ被写体の 2 つの異なる写真ではうまく機能しませんが、検証したい同じ画像の 2 つのコピーがある場合は機能します。
2 つの同一の画像の場合は簡単です。ピクセル配列をループして、RGB 値を他方から減算するだけです。差が小さい許容範囲よりも小さい場合、ピクセルは同一です。したがって、ピクセルの差が許容範囲を超えるとすぐに、画像が異なっていることがわかります。
圧縮アーティファクトによる差異を許容するために、特定の数またはパーセンテージの差異を許容することができます。
色の変化を確認するには、代わりに HLS (色相、明度、彩度) の値を調べることができます。ピクセルの L と S の値が同じで H の値が異なる場合、色が異なるだけです (私はそう思います)。
大きな画像内で小さな画像の位置を見つけようとする必要があるため、トリミングはより困難です。
次のようなオブジェクト記述子を使用できます。
SIFT - http://en.wikipedia.org/wiki/Scale-invariant_feature_transform
SURF - http://en.wikipedia.org/wiki/SURF
次に、計算された記述子を使用してイメージを比較します。これらの記述子を使用すると、回転、スケーリング、およびわずかに変更された画像を処理できます。
また、記述子は方向付けられたグラデーションで構成されているため、これらの記述子は照明や色の変化に対しても堅牢です。
Accord.NET (SURF 実装) を使用できます。