123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- # -*- 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))
|