imgHash.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on 2024-11-05
  4. ---------
  5. @summary: 感知哈希算法(Perceptual hash algorithm)
  6. 参考: https://github.com/nivance/image-similarity?tab=readme-ov-file
  7. ---------
  8. """
  9. from functools import reduce
  10. from pathlib import Path
  11. from PIL import Image
  12. def avhash(im):
  13. if not isinstance(im, Image.Image):
  14. im = Image.open(im)
  15. im = im.resize((8, 8), Image.Resampling.LANCZOS).convert('L')
  16. avg = sum(im.getdata()) / 64.
  17. return reduce(lambda x, y: x | (y[1] << y[0]),
  18. enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())),
  19. 0)
  20. def hamming(h1, h2):
  21. h, d = 0, h1 ^ h2
  22. while d:
  23. h += 1
  24. d &= d - 1
  25. return h
  26. if __name__ == '__main__':
  27. # im, wd = './cache/image/0x100a0.jpg', './cache/image'
  28. #
  29. # h = avhash(im)
  30. #
  31. # seq = []
  32. # images = Path('./cache/image').iterdir()
  33. # for f in images:
  34. # print(f.name)
  35. # seq.append((f, hamming(avhash(f), h)))
  36. # for f, ham in sorted(seq, key=lambda i: i[1]):
  37. # print("{}\t{}".format(ham, f))
  38. im1 = 'cache/0x100af.jpg'
  39. im2 = 'image/0x10075.jpg'
  40. h = avhash(im1)
  41. print(hamming(avhash(im2), h))