Voglio creare una mappatura in Python che userà le immagini come chiavi, ma tratteremo immagini simili (ma non identiche) come la stessa chiave. Ho un approccio per decidere quali immagini sono abbastanza simili: le riduco, le converto in line art e poi computo la somma md5. Due immagini sono "abbastanza simili" applicando questo processo a loro genera lo stesso risultato (e come si spera che questa relazione sia transitiva).
Il calcolo di questo checksum richiede molto tempo di calcolo, quindi preferirei farlo meno volte. Per fare ciò, penso che dovrei scrivere un wrapper SmartImage
(ho bisogno di un nome migliore) per le immagini di PIL che memorizza il risultato del checksum. Da lì posso pensare a due design:
- Sottoclasse
collections.MutableMapping
e crea una classe simile a un dizionario che opera sulle immagini e, sotto il cofano, calcola il mio assegno e incolla i risultati in qualche altra mappatura mutevole (uno scaffale nel mio caso) - Dare a
SmartImage
un metodo personalizzato__hash__
che riporta il mio checksum e poi andare avanti e usarlo con qualunque classe di raccolta sia conveniente. Forse dovrei fornire anche altri metodi (forse__eq__
).
La mia domanda è, l'opzione # 2 è accettabile, oppure la barra per avere lo stesso codice hash in Python abbastanza alto che anche una classe che è stata specificatamente progettata per eseguire la corrispondenza fuzzy non dovrebbe fornire lo stesso valore hash per non identici immagini?
def get_thumbnail(image):
im2 = image.copy()
return im2.convert("L")
def image_pixel_hash_code(image):
pixels = list(image.getdata())
avg = sum(pixels) / len(pixels)
bits = bitarray(1 if pixel < avg else 0 for pixel in pixels)
return b64encode(hashlib.md5(str(bits)).hexdigest())