2023/05/21(日) [n年前の日記]
#1 [python] PythonとImageHashを使って画像を比較
Pythonを使って、画像を比較して類似度を調べたい。ググってみたら ImageHash というモジュールが使えそうなので試してみる。
環境は、Windows10 x64 22H2 + Python 3.10.6。
環境は、Windows10 x64 22H2 + Python 3.10.6。
◎ 参考ページ :
_【Python】画像の類似度比較が可能なImageHashのインストール | ジコログ
_Python 類似ハッシュ用いて 類似画像を削除する方法 imagehash Pillow | FascodeNetwork Blog
_Python の類似画像ライブラリ ImageHash を Windows で使う | Aqua Ware つぶやきブログ
_ImageHash - PyPI
_GitHub - JohannesBuchner/imagehash: A Python Perceptual Image Hashing Module
_imagehash/setup.py at master - JohannesBuchner/imagehash - GitHub
_Python 類似ハッシュ用いて 類似画像を削除する方法 imagehash Pillow | FascodeNetwork Blog
_Python の類似画像ライブラリ ImageHash を Windows で使う | Aqua Ware つぶやきブログ
_ImageHash - PyPI
_GitHub - JohannesBuchner/imagehash: A Python Perceptual Image Hashing Module
_imagehash/setup.py at master - JohannesBuchner/imagehash - GitHub
◎ 必要なモジュールをインストール :
setup.py を眺めた感じでは、以下のモジュールも必要になるらしい。
pipでインストールする。
numpy scipy pillow PyWavelets
pipでインストールする。
pip install numpy -U pip install scipy -U pip install pillow -U pip install PyWavelets -U pip install ImageHash -U
> pip list | grep -e "numpy" -e "scipy" -e "Pillow" -e "PyWavelets" -e "ImageHash" ImageHash 4.3.1 numpy 1.24.3 Pillow 9.5.0 PyWavelets 1.4.1 scipy 1.10.1
◎ 使い方 :
使い方のサンプルは、前述のページを参考に。
同じ画像ならハッシュの差は0になるし、違う画像ならハッシュの差は0以外になるっぽい。画像内容がどのくらいかけ離れていたらどんな値が出てくるのかはちょっとよく分からない。
from PIL import Image import imagehash file1 = "images/src/RE4IqsU_1920x1080.jpg" file2 = "images/dst/RE4IqsU_1920x1080.jpg" # file2 = "images/dst/RE4NSAw_1920x1080.jpg" hash_src = imagehash.average_hash(Image.open(file1)) hash_dst = imagehash.average_hash(Image.open(file2)) print(hash_src == hash_dst) print(hash_src - hash_dst)
同じ画像ならハッシュの差は0になるし、違う画像ならハッシュの差は0以外になるっぽい。画像内容がどのくらいかけ離れていたらどんな値が出てくるのかはちょっとよく分からない。
◎ ディレクトリ単位で比較 :
二つのディレクトリを渡して、同じファイル名のjpgがあったら、中身も似てるのかどうか確認して結果を出してみるスクリプトを書いてみた。
_imgdircmp.py
python imgdircmp.py DIR1 DIR2
_imgdircmp.py
import sys import os import re from PIL import Image import imagehash def get_files(dirpath): files = {} for file in os.listdir(dirpath): if re.search("\.jpg$", file): path = os.path.join(dirpath, file) if os.path.isfile(path): files[file.lower()] = file return files def main(): if len(sys.argv) != 3: print("Error: usage python script.py DIR1 DIR2") _ = input("\nPush any key") sys.exit() srcdir = sys.argv[1] dstdir = sys.argv[2] print("Dir A: %s" % srcdir) print("Dir B: %s" % dstdir) files_a = get_files(srcdir) files_b = get_files(dstdir) for file in files_a.keys(): if file in files_b: rfile_a = files_a[file] rfile_b = files_b[file] path_a = os.path.join(srcdir, rfile_a) path_b = os.path.join(dstdir, rfile_b) hash_a = imagehash.average_hash(Image.open(path_a)) hash_b = imagehash.average_hash(Image.open(path_b)) if hash_a - hash_b == 0: print("Same image : %s" % rfile_a) else: print("Different image : %s" % rfile_a) _ = input("\nPush any key") if __name__ == '__main__': main()
[ ツッコむ ]
以上です。