はじめに
2つの画像の同一性をイメージハッシュで比較方法を確認する。
イメージハッシュについて
一般にハッシュは、文字列からハッシュ関数を使って得られた値を指す。
画像でも同じようなことができて、要約した値が生成できる。
そのため大量にある画像をイメージハッシュを使うことで、類似したパターンの画像を絞り込むことが可能。
ハッシュ関数は複数あるので、比較するためには1つに絞りこむ必要がある。
参照:
https://qiita.com/mamo3gr/items/b93545a0346d8731f03c
2つのイメージハッシュを比較する
ハッシュの距離を計算するには、排他的論理和(XOR)をとり、「1」をカウントする。
ソースコード例(Python)
hash_a = 'b69cbd89090b8f8e'
hash_a_value = int(hash_a, 16)
hash_b = 'b69c3d89090b0f8e'
hash_b_value = int(hash_b, 16)
hamming_distance = bin(hash_a_value ^ hash_b_value).count('1')
print(hamming_distance)
上記ソース内のハッシュのハミング距離を計算する。
hash_aを2進数に変換すると 1011011010011100101111011000100100001001000010111000111110001110
hash_bを2進数に変換すると 1011011010011100001111011000100100001001000010110000111110001110
排他的論理和をとると 0000000000000000100000000000000000000000000000001000000000000000 となる。
1の数は2となり、ハミング距離は 2 になる。
ハミング距離による画像の類似度
ハミング距離が10以下の場合、ほぼ同一画像となるが確実に同一とは言えない。
もし同一であることを確定させるのであれば、別の処理で確定させる必要がある。
まとめ
画像の同一性を保証するには、イメージハッシュのみでは不足している。
画像の特徴量などを使う必要がある。
比較する画像数が少なければ、画像の特徴量を使って比較で事足りるが、
数千万画像などに対して比較するのであれば、イメージハッシュで比較対象を絞り込むのも有りではないかとおもう。
特徴量などの記事
https://qiita.com/hmichu/items/f5f1c778a155c7c414fd
https://qiita.com/hitomatagi/items/caac014b7ab246faf6b1