# -*- coding: utf-8 -*- """ Created on 2024-11-05 --------- @summary: 感知哈希算法(Perceptual hash algorithm) 参考: https://github.com/nivance/image-similarity?tab=readme-ov-file --------- """ from functools import reduce from pathlib import Path from PIL import Image def avhash(im): if not isinstance(im, Image.Image): im = Image.open(im) im = im.resize((8, 8), Image.Resampling.LANCZOS).convert('L') avg = sum(im.getdata()) / 64. return reduce(lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())), 0) def hamming(h1, h2): h, d = 0, h1 ^ h2 while d: h += 1 d &= d - 1 return h if __name__ == '__main__': # im, wd = './cache/image/0x100a0.jpg', './cache/image' # # h = avhash(im) # # seq = [] # images = Path('./cache/image').iterdir() # for f in images: # print(f.name) # seq.append((f, hamming(avhash(f), h))) # for f, ham in sorted(seq, key=lambda i: i[1]): # print("{}\t{}".format(ham, f)) im1 = 'cache/0x100af.jpg' im2 = 'image/0x10075.jpg' h = avhash(im1) print(hamming(avhash(im2), h))