Impronta digitale dell'immagine per confrontare la somiglianza di molte immagini


94

Ho bisogno di creare impronte digitali di molte immagini (circa 100.000 esistenti, 1000 nuove al giorno, RGB, JPEG, dimensione massima 800x800) per confrontare ogni immagine con ogni altra immagine molto velocemente. Non posso usare metodi di confronto binario perché dovrebbero essere riconosciute anche immagini che sono quasi simili.

La cosa migliore sarebbe una libreria esistente, ma anche alcuni suggerimenti agli algoritmi esistenti mi aiuterebbero molto.


1
Lingua per cui dovrebbe essere la biblioteca?
Ben S,

Risposte:


57

I normali algoritmi di hashing o di calcolo CRC non funzionano bene con i dati dell'immagine. La natura dimensionale delle informazioni deve essere presa in considerazione.

Se hai bisogno di impronte digitali estremamente robuste, in modo tale da tenere conto delle trasformazioni affini (ridimensionamento, rotazione, traslazione, capovolgimento), puoi utilizzare una trasformazione Radon sull'origine dell'immagine per produrre una mappatura normativa dei dati dell'immagine: memorizzala con ogni immagine e quindi confronta solo le impronte digitali. Questo è un algoritmo complesso e non per i deboli di cuore.

sono possibili alcune semplici soluzioni:

  1. Crea un istogramma di luminosità per l'immagine come un'impronta digitale
  2. Crea versioni ridotte di ciascuna immagine come impronta digitale
  3. Combina la tecnica (1) e (2) in un approccio ibrido per una migliore qualità di confronto

Un istogramma di luminosità (specialmente uno separato in componenti RGB) è un'impronta digitale ragionevole per un'immagine e può essere implementato in modo abbastanza efficiente. La sottrazione di un istogramma da un altro produrrà un nuovo storogramma che puoi elaborare per decidere quanto siano simili due immagini. Gli istogrammi, perché l'unico a valutare la distribuzione e l'occorrenza delle informazioni di luminosità / colore gestisce abbastanza bene le trasformazioni affini. Se quantizzi le informazioni sulla luminosità di ciascun componente del colore fino a un valore di 8 bit, 768 byte di memoria sono sufficienti per l'impronta digitale di un'immagine di quasi tutte le dimensioni ragionevoli. Gli istogrammi di luminosità producono falsi negativi quando vengono manipolate le informazioni sul colore in un'immagine. Se applichi trasformazioni come contrasto / luminosità, posterizzazione, cambio di colore, modifiche alle informazioni sulla luminosità.

L'utilizzo di immagini in scala è un altro modo per ridurre la densità delle informazioni dell'immagine a un livello più facile da confrontare. Le riduzioni al di sotto del 10% della dimensione dell'immagine originale generalmente perdono troppe informazioni per essere utili, quindi un'immagine da 800x800 pixel può essere ridimensionata fino a 80x80 e fornisce comunque informazioni sufficienti per eseguire un fingerprinting decente. A differenza dei dati dell'istogramma, è necessario eseguire il ridimensionamento anisotropo dei dati dell'immagine quando le risoluzioni della sorgente hanno proporzioni variabili. In altre parole, ridurre un'immagine 300x800 in una miniatura 80x80 provoca la deformazione dell'immagine, in modo tale che se confrontata con un'immagine 300x500 (che è molto simile) causerà falsi negativi. Le impronte digitali delle miniature spesso producono anche falsi negativi quando sono coinvolte trasformazioni affini. Se capovolgi o ruoti un'immagine,

La combinazione di entrambe le tecniche è un modo ragionevole per proteggere le tue scommesse e ridurre il verificarsi di falsi positivi e falsi negativi.


Per quanto riguarda CRC, d'accordo. Tuttavia, se si vuole usarlo, è meglio usare l'hash MD5 rispetto a CRC32
mloskot

5
Non vorrai usare MD5 perché è un hash crittografico unidirezionale. È necessario utilizzare un metodo hash che produrrà un risultato simile per un input simile in modo da poter confrontare direttamente le differenze tra gli hash.
AJ Quick

34

C'è un approccio molto meno ad-hoc rispetto alle varianti di immagine ridotte che sono state proposte qui che mantiene il loro sapore generale, ma che fornisce una base matematica molto più rigorosa per ciò che sta accadendo.

Prendi un wavelet di Haar dell'immagine. Fondamentalmente il wavelet di Haar è la successione di differenze dalle immagini a risoluzione inferiore a ciascuna immagine a risoluzione più elevata, ma ponderata da quanto sei profondo nell '"albero" delle mipmap. Il calcolo è semplice. Quindi, una volta che hai pesato adeguatamente il wavelet di Haar, butta via tutti i coefficienti più grandi tranne k (in termini di valore assoluto), normalizza il vettore e salvalo.

Se prendi il prodotto scalare di due di quei vettori normalizzati, ottieni una misura di somiglianza con 1 che è quasi identico. Ho pubblicato ulteriori informazioni qui .


20

Dovresti assolutamente dare un'occhiata a phash .

Per il confronto delle immagini c'è questo progetto php : https://github.com/kennethrapp/phasher

E il mio piccolo clone di javascript : https://redaktor.me/phasher/demo_js/index.html

Sfortunatamente questo è basato su "bitcount" ma riconoscerà le immagini ruotate. Un altro approccio in javascript consisteva nel costruire un istogramma di luminosità dall'immagine con l'aiuto della tela. Puoi visualizzare un istogramma poligonale sulla tela e confrontare quel poligono nel tuo database (es. Spazio mySQL ...)


è su npm? Sto cercando un modo per confrontare la somiglianza tra due immagini utilizzando javascript
chovy

Hm, ho pensato che fosse "economico per npm". Era davvero solo una demo scritta velocemente da zero. Tuttavia, sentiti libero di fare quello che vuoi con la fonte. Se riesco a farcela, lo esaminerò più tardi e lo
invierò

@SebastianLasse Ho appena controllato il tuo porting JS ed è fantastico! Vorrei solo che tu possa passare un URI di immagine alla Compare()funzione invece di dover scaricare prima l'immagine. Inoltre, dai miei test, la soglia per "un'immagine molto simile" dovrebbe essere> 90%, non> 98%.
thdoan

12

Molto tempo fa ho lavorato su un sistema che avesse alcune caratteristiche simili, e questa è un'approssimazione dell'algoritmo che abbiamo seguito:

  1. Dividi l'immagine in zone. Nel nostro caso avevamo a che fare con video con risoluzione 4: 3, quindi abbiamo utilizzato 12 zone. In questo modo la risoluzione delle immagini di origine viene rimossa dall'immagine.
  2. Per ogni zona, calcola un colore complessivo, la media di tutti i pixel nella zona
  3. Per l'intera immagine, calcola un colore complessivo, la media di tutte le zone

Quindi per ogni immagine, stai memorizzando n + 1valori interi, dov'è nil numero di zone che stai monitorando.

Per i confronti, è inoltre necessario esaminare singolarmente ciascun canale di colore.

  1. Per l'immagine complessiva, confronta i canali di colore per i colori complessivi per vedere se rientrano in una certa soglia, ad esempio il 10%
  2. Se le immagini rientrano nella soglia, confrontare successivamente ciascuna zona. Se anche tutte le zone rientrano nella soglia, le immagini sono una corrispondenza abbastanza forte da poterle almeno contrassegnare per un ulteriore confronto.

Ciò consente di eliminare rapidamente le immagini che non corrispondono; puoi anche utilizzare più zone e / o applicare l'algoritmo in modo ricorsivo per ottenere una maggiore sicurezza di corrispondenza.


6

Simile alla risposta di Ic: potresti provare a confrontare le immagini a più risoluzioni. Quindi ogni immagine viene salvata come 1x1, 2x2, 4x4 .. 800x800. Se la risoluzione più bassa non corrisponde (soggetta a una soglia), puoi rifiutarla immediatamente. Se corrisponde, puoi confrontarli alla risoluzione successiva più alta e così via.

Inoltre, se le immagini condividono una struttura simile, come le immagini mediche, potresti essere in grado di estrarre quella struttura in una descrizione più facile / veloce da confrontare.


Penso che sia associato a una sorta di ricerca sugli alberi. È interessante.
André Laszlo

3

Quindi vuoi fare la "corrispondenza delle impronte digitali" che è molto diversa dalla "corrispondenza delle immagini". L'analisi delle impronte digitali è stata studiata a fondo negli ultimi 20 anni e sono stati sviluppati diversi algoritmi interessanti per garantire il giusto tasso di rilevamento (rispetto alle misure FAR e FRR - False Acceptance Rate e False Rejection Rate ).

Ti suggerisco di guardare meglio alla classe di tecniche di rilevamento LFA (Local Feature Analysis) , per lo più basata su ispezioni minuziose. Le minuzie sono caratteristiche specifiche di qualsiasi impronta digitale e sono state classificate in diverse classi. Mappare un'immagine raster su una mappa minuziosa è ciò che in realtà la maggior parte delle autorità pubbliche fa per denunciare criminali o terroristi.

Vedi qui per ulteriori riferimenti


Sai come calcolare il tasso di falsa accettazione se hai una distribuzione gaussiana dei punteggi per un dato sistema biometrico?
GobiasKoffi

OP vuole "creare impronte digitali di molte immagini". Non confrontare immagini di impronte digitali umane.
Navin


3

A partire dal 2015 (tornando al futuro ... su questa domanda del 2009 che è ora in cima alla classifica di Google) la somiglianza delle immagini può essere calcolata utilizzando tecniche di Deep Learning. La famiglia di algoritmi noti come Auto Encoder può creare una rappresentazione vettoriale che è ricercabile per somiglianza. C'è una demo qui .


È possibile generare un'immagine dell'impronta digitale da dati binari?
SwR

Certo, ci sono ANN per questo compito, ma la tua risposta non sembra effettivamente rispondere a nulla. La domanda è: come si fa? La pagina collegata non rivela alcuna informazione e nemmeno il termine "Codificatori automatici" aiuta.
Simon Steinberger

la domanda originale non dice "Come si fa?", ma dice "alcuni suggerimenti agli algoritmi esistenti mi aiuterebbero molto", che è quello che ho fornito.
Alex R

Non hai collegato un "suggerimento" a un algoritmo, infatti la pagina collegata dice: "funziona, ma nessuno sa perché. Per favore, non aspettarti troppo dal risultato" ...
odyth

Questo deeplearning4j.org/deepautoencoder#use-cases fornisce maggiore chiarezza su come gli Auto Encoder possono essere usati per creare un'impronta digitale e quindi su come puoi usare quell'impronta digitale per trovare somiglianze in altre immagini in base a quanto sono simili i vertici.
odyth

2

Un modo per farlo è ridimensionare l'immagine e ridurre la risoluzione in modo significativo (a 200x200 forse?), Memorizzando una versione più piccola (media pixel) per fare il confronto. Quindi definire una soglia di tolleranza e confrontare ogni pixel. Se l'RBG di tutti i pixel rientra nella tolleranza, hai una corrispondenza.

La tua analisi iniziale è O (n ^ 2) ma se cataloghi tutte le corrispondenze, ogni nuova immagine è solo un algoritmo O (n) da confrontare (devi solo confrontarla con ciascuna immagine inserita in precedenza). Alla fine, tuttavia, si interromperà man mano che l'elenco delle immagini da confrontare diventa più grande, ma penso che tu sia al sicuro per un po '.

Dopo 400 giorni di esecuzione, avrai 500.000 immagini, il che significa (scontando il tempo per ridimensionare l'immagine verso il basso) 200(H)*200(W)*500,000(images)*3(RGB)= 60.000.000.000 di confronti. Se ogni immagine è una corrispondenza esatta, rimarrai indietro, ma probabilmente non sarà così, giusto? Ricorda, puoi scontare un'immagine come una corrispondenza non appena un singolo confronto non rientra nella tua soglia.


2

Vuoi letteralmente confrontare ogni immagine con le altre? Qual è l'applicazione? Forse hai solo bisogno di una sorta di indicizzazione e recupero di immagini in base a determinati descrittori? Quindi, ad esempio, puoi guardare lo standard MPEG-7 per Multimedia Content Description Interface. Quindi puoi confrontare i diversi descrittori di immagini, che non saranno così accurati ma molto più veloci.


forse una scelta tra esaustivo e limitato
johnny

0

Sembra che gli algoritmi di hashing delle immagini specializzati siano un'area di ricerca attiva, ma forse un normale calcolo hash dei byte dell'immagine farebbe il trucco.

Stai cercando immagini identiche al byte piuttosto che cercare immagini che derivano dalla stessa fonte ma che potrebbero avere un formato o una risoluzione diversi (il che mi sembra un problema piuttosto difficile).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.