mieki256's diary



2023/05/21() [n年前の日記]

#1 [python] PythonとImageHashを使って画像を比較

Pythonを使って、画像を比較して類似度を調べたい。ググってみたら ImageHash というモジュールが使えそうなので試してみる。

環境は、Windows10 x64 22H2 + Python 3.10.6。

参考ページ :

必要なモジュールをインストール :

setup.py を眺めた感じでは、以下のモジュールも必要になるらしい。
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

使い方 :

使い方のサンプルは、前述のページを参考に。

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があったら、中身も似てるのかどうか確認して結果を出してみるスクリプトを書いてみた。

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()

以上です。

過去ログ表示

Prev - 2023/05 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project