Ho bisogno di un modo semplice e veloce per confrontare due immagini per somiglianza. Vale a dire che voglio ottenere un valore elevato se contengono esattamente la stessa cosa ma possono avere uno sfondo leggermente diverso e possono essere spostati / ridimensionati di alcuni pixel.
(Più concreto, se questo è importante: una foto è un'icona e l'altra immagine è una sottoarea di uno screenshot e voglio sapere se quella sottoarea è esattamente l'icona o meno.)
Ho OpenCV a portata di mano ma non sono ancora abituato.
Una possibilità a cui ho pensato finora: dividere entrambe le immagini in celle 10x10 e per ognuna di quelle 100 celle, confrontare l'istogramma del colore. Quindi posso impostare un determinato valore soglia e se il valore che ottengo è al di sopra di tale soglia, presumo che siano simili.
Non ho ancora provato quanto funzioni bene, ma credo che sarebbe abbastanza buono. Le immagini sono già abbastanza simili (nel mio caso d'uso), quindi posso usare un valore di soglia piuttosto alto.
Immagino ci siano dozzine di altre possibili soluzioni per questo che funzionerebbero più o meno (dato che l'attività stessa è abbastanza semplice in quanto voglio rilevare la somiglianza solo se sono davvero molto simili). Che cosa suggeriresti?
Ci sono alcune domande molto correlate / simili sull'ottenimento di una firma / impronta digitale / hash da un'immagine:
- OpenCV / SURF Come generare un'immagine hash / impronta digitale / firma dai descrittori?
- Impronta digitale dell'immagine per confrontare la somiglianza di molte immagini
- Rilevamento di immagini quasi duplicate
- OpenCV: immagine dell'impronta digitale e confronto con il database .
- di più , di più , di più , di più , di più , di più , di più
Inoltre, mi sono imbattuto in queste implementazioni che hanno tali funzioni per ottenere un'impronta digitale:
- phash
- imgSeek ( GitHub repo ) (GPL) basato sul documento Fast Multiresolution Image Querying
- corrispondenza dell'immagine . Molto simile a quello che stavo cercando. Simile a pHash, basato sulla firma di un'immagine per qualsiasi tipo di immagine, Goldberg et al . Utilizza Python ed Elasticsearch.
- iqdb
- ImageHash . supporta pHash.
- Deduplicatore di immagini (imagededup) . Supporta CNN, PHash, DHash, WHash, AHash.
Alcune discussioni sugli hash delle immagini percettive: qui
Un po 'offtopico: esistono molti metodi per creare impronte digitali. MusicBrainz , un servizio web che fornisce una ricerca basata su impronte digitali per le canzoni, ha una buona panoramica nella loro wiki . Stanno usando AcoustID ora. Questo serve per trovare corrispondenze esatte (o per lo più esatte). Per trovare corrispondenze simili (o se hai solo frammenti o rumori elevati), dai un'occhiata a Echoprint . Una domanda SO correlata è qui . Quindi sembra che questo sia risolto per l'audio. Tutte queste soluzioni funzionano abbastanza bene.
Una domanda un po 'più generica sulla ricerca fuzzy in generale è qui . Ad esempio, esiste un hash sensibile alla località e la ricerca del vicino più vicino .