ほぼ同一の画像でも非常に異なるハッシュ値が得られるため、ここでは、任意の形式のハッシュを使用しても意味がありません。コメントで指摘されているように、2 つの「重複」画像はわずかに異なる可能性があるため (たとえば、JPEG 圧縮によって引き起こされる効果を考えてください)、ほぼ重複した画像を検出することに関心があります。また、コメントで指摘されているように、同じ幅の画像のみを考慮することは、比較の二次数を減らすための最初のステップです。すべての画像が同じ幅の場合、改善はありません。
最初に解決しなければならない問題は、高さが異なるほぼ同一の画像の一番下のボックスを破棄することです。なぜこの箱があるのですか?均一な背景色ですか?画像を前処理して、そのようなボトム ボックスを削除します。問題がある場合は、その理由を説明してください。これらのボックスは今後削除されたと見なします。
SSIM (Structural SIMilarity) はほぼ重複を検出するための優れたアプローチかもしれませんが、 Comparing image in url to image in filesystem in python で説明されている NRMSE などの単純なアルゴリズムよりも高速になる可能性はありません。したがって、プロセスを高速化する方法 (本質的には 2 次のままですが) は、最初に特定の画像をグレースケールに変換し、50x50 などの小さな中央ウィンドウのみを考慮することです。この中央のウィンドウにガウス フィルターを適用すると、マイナーな構造 (ノイズなど) がほとんど抑制されます。比較する画像がかなりあるので、この平滑化された中央のウィンドウに次の形式で大まかな 2 値化を適用します。v
可能な最大値の半分より大きい場合は白に、それ以外の場合は黒にします。これで、各画像に 2500 ビットが割り当てられました。次のステップは次のようになります。これらの 2500 ビットから共通のビット パターンまでのハミング距離を計算します。ここでは 2500 ビット 1 が機能します。すべての画像に対してこのプロセスを繰り返します。画像ごとにハミング距離があります。
次に、ほぼ同一の画像を見つけてみましょう。最初に、見つかったハミング距離をk
個別のスロットにビニングすることを検討してください。そのため、同じビンに含まれるすべての画像が比較のためにさらに考慮されます。このように、画像a
が bink_i
にあり、画像b
が bink_j
にある場合、に類似しているものとしてi != j
破棄します。同じビンに画像が多すぎる場合は、上記のプロセスを調整するか、各ビンの間隔を縮小する必要があります。プロセスをさらに高速化するには、最初に同じビン内のすべての画像間で NRMSE を適用することを検討してください。最終的に、高い値を示す画像のみが SSIM によって比較されます。a
b