from typing import Iterable from PIL import Image from image_prediction.encoder.encoder import Encoder class HashEncoder(Encoder): def encode(self, images: Iterable[Image.Image]): yield from map(hash_image, images) def __call__(self, images: Iterable[Image.Image], batch_size=16): yield from self.encode(images) def hash_image(image: Image.Image): """See: https://stackoverflow.com/a/49692185/3578468""" image = image.resize((10, 10), Image.ANTIALIAS) image = image.convert("L") pixel_data = list(image.getdata()) avg_pixel = sum(pixel_data) / len(pixel_data) bits = "".join(["1" if (px >= avg_pixel) else "0" for px in pixel_data]) hex_representation = str(hex(int(bits, 2)))[2:][::-1].upper() return hex_representation