Rilevamento di immagini quasi duplicate [chiuso]


93

Qual è un modo veloce per ordinare un dato insieme di immagini in base alla loro somiglianza tra loro.

Al momento ho un sistema che esegue l'analisi dell'istogramma tra due immagini, ma questa è un'operazione molto costosa e sembra troppo eccessiva.

In modo ottimale, sto cercando un algoritmo che dia a ciascuna immagine un punteggio (ad esempio un punteggio intero, come la media RGB) e posso semplicemente ordinare in base a quel punteggio. Punteggi identici o punteggi uno accanto all'altro sono possibili duplicati.

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994 

La media RGB per immagine fa schifo, c'è qualcosa di simile?


5
Una domanda chiave, pensando a ciò che hai scritto e ad alcune delle risposte alla domanda correlata che Naaff ha indicato, potresti voler definire più chiaramente cosa significa "somiglianza". Un'immagine identica, ma con un offset di cinque pixel, sarebbe "simile"? Visivamente sì ... ma a un algoritmo ... probabilmente no, a meno che tu non ci abbia pensato e te ne rendessi conto. Potete fornire ulteriori dettagli? I duplicati sarebbero esatti o semplicemente "chiusi"? Stai guardando scansioni in cui potrebbero differire di una leggera misura angolare? Che ne dici dell'intensità? Ci sono molte variabili qui ...
Beska

In che modo differiscono i "duplicati"? Ad esempio, sarebbero immagini della stessa posizione con posa / spostamento diversi? Sembra che tu voglia qualcosa che sia O (nlog (n)) con il numero di immagini. Qualcuno sa se questo è possibile? Sembra che potrebbe essere ..
Justin Scheiner il

@ The Unknown: Se non sei soddisfatto di nessuna delle risposte attuali, potresti darci qualche guida in più? Abbiamo fatto del nostro meglio per rispondere alla tua domanda, ma senza alcun feedback è improbabile che riusciremo a trovare qualcosa di meglio.
Naaff

Questo è attualmente uno dei grandi problemi irrisolti in Informatica. Buona fortuna amico.
john ktejik

Risposte:


70

Sono state condotte molte ricerche sulla ricerca di immagini e sulle misure di somiglianza. Non è un problema facile. In generale, un singolo intnon sarà sufficiente per determinare se le immagini sono molto simili. Avrai un alto tasso di falsi positivi.

Tuttavia, poiché sono state fatte molte ricerche, potresti dare un'occhiata ad alcune di esse. Ad esempio, questo documento (PDF) fornisce un algoritmo di fingerprinting di immagini compatto adatto per trovare rapidamente immagini duplicate e senza memorizzare molti dati. Sembra che questo sia l' approccio giusto se vuoi qualcosa di robusto.

Se stai cercando qualcosa di più semplice, ma decisamente più ad-hoc, questa domanda SO ha alcune idee decenti.


2
quel giornale è del 2004, non sei sicuro che questa sia ancora la risposta migliore?
Andrew

50

Consiglierei di considerare di allontanarsi dall'usare solo un istogramma RGB.

È possibile ottenere un riassunto migliore della tua immagine se prendi un wavelet 2d Haar dell'immagine (è molto più facile di quanto sembri, è solo un sacco di media e alcune radici quadrate usate per pesare i tuoi coefficienti) e mantieni solo il k più grande coefficienti ponderati nel wavelet come un vettore sparse, normalizzarlo e salvarlo per ridurne le dimensioni. Dovresti riscalare RG e B usando almeno i pesi percettivi in ​​anticipo o ti consiglio di passare a YIQ (o YCoCg, per evitare il rumore di quantizzazione) in modo da poter campionare le informazioni sulla crominanza con importanza ridotta.

È ora possibile utilizzare il prodotto scalare di due di questi vettori normalizzati sparsi come misura della somiglianza. Le coppie di immagini con i prodotti di punti più grandi saranno molto simili nella struttura. Questo ha il vantaggio di essere leggermente resistente al ridimensionamento, allo spostamento della tonalità e alla filigrana, ed è davvero facile da implementare e compattare.

È possibile compromettere l'archiviazione e la precisione aumentando o diminuendo k.

L'ordinamento in base a un singolo punteggio numerico sarà intrattabile per questo tipo di problema di classificazione. Se ci pensi, le immagini dovrebbero essere in grado di "cambiare" solo lungo un asse, ma non lo fanno. Questo è il motivo per cui hai bisogno di un vettore di caratteristiche. Nel caso wavelet di Haar è approssimativamente dove si verificano le discontinuità più nette nell'immagine. Puoi calcolare una distanza tra le immagini a coppie, ma poiché tutto ciò che hai è una metrica della distanza, un ordinamento lineare non ha modo di esprimere un "triangolo" di 3 immagini che sono tutte ugualmente distanti. (es. pensa a un'immagine che è tutta verde, un'immagine che è tutta rossa e un'immagine che è tutta blu.)

Ciò significa che qualsiasi soluzione reale al tuo problema richiederà O (n ^ 2) operazioni nel numero di immagini che hai. Considerando che se fosse stato possibile linearizzare la misura, si potrebbe richiedere solo O (n log n), o O (n) se la misura fosse adatta, diciamo, a un ordinamento digitale. Detto questo, non è necessario spendere O (n ^ 2) poiché in pratica non è necessario setacciare l'intero set, devi solo trovare le cose che sono più vicine di una certa soglia. Quindi, applicando una delle diverse tecniche per partizionare il tuo spazio vettoriale sparso puoi ottenere asintotici molto più veloci per il problema del 'trovarmi k delle immagini che sono più simili a una data soglia' piuttosto che confrontare ingenuamente ogni immagine con ogni immagine, dandoti cosa probabilmente hai bisogno di ... se non esattamente quello che hai chiesto.

In ogni caso, l'ho usato alcuni anni fa con buoni risultati personalmente quando cercavo di ridurre al minimo il numero di diverse trame che stavo memorizzando, ma c'è stato anche un sacco di rumore di ricerca in questo spazio che mostra la sua efficacia (e in questo caso il confronto a una forma più sofisticata di classificazione dell'istogramma):

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

Se hai bisogno di una migliore precisione nel rilevamento, gli algoritmi minHash e tf-idf possono essere utilizzati con il wavelet di Haar (o l'istogramma) per gestire le modifiche in modo più robusto:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

Infine, Stanford ha una ricerca di immagini basata su una variante più esotica di questo tipo di approccio, basata sull'estrazione di più funzionalità dalle wavelet per trovare sezioni di immagini ruotate o ridimensionate, ecc., Ma questo probabilmente va ben oltre la quantità di lavoro vorrei fare.

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi


Sembra che tu stia descrivendo indirettamente kd-tree e simili per cercare lo spazio per potenziali candidati. Potrebbe valere la pena notare questo.
Boojum

1
Ebbene, il motivo per cui non ho specificato tecniche oltre a una sorta di vaga allusione è che gli alberi kd funzionano bene quando hai un numero relativamente piccolo di dimensioni nel tuo spazio. Qui probabilmente hai ~ 128 o più dimensioni che sono scarsamente popolate. Dato che sono scarsi, la maggior parte dei valori sarà zero, quindi andare all'italiana attraverso le dimensioni per partizionare in stile kd è in realtà quasi inutile. Allo stesso modo gli R-tree si rompono, lasciando molto probabilmente la soluzione migliore: X-tree. Sfortunatamente, sono anche vicini al limite delle loro prestazioni di fronte a così tante dimensioni.
Edward KMETT

"e mantieni semplicemente i k coefficienti ponderati più grandi nel wavelet come un vettore sparse," - conserva per riga o per l'intero wavelet?
ivan.ukr

"Dovresti riscalare RG e B usando almeno i pesi percettivi o ti consiglio di passare a YIQ (o YCoCg, per evitare il rumore di quantizzazione) in modo da poter campionare le informazioni sulla crominanza con importanza ridotta." - e poi cosa? Wavelet solo per Y o per tutti i canali? Se per tutti i canali, come misurare la somiglianza di immagini con più canali? aggiungi i prodotti punto di ogni canale e considera questo come misura di somiglianza o dovrebbe essere un'aggiunta ponderata?
ivan.ukr

15

Ho implementato un algoritmo molto affidabile per questo chiamato Fast Multiresolution Image Querying . Il mio codice (antico, non mantenuto) per questo è qui .

Quello che fa Fast Multiresolution Image Querying è dividere l'immagine in 3 parti in base allo spazio colore YIQ (meglio per le differenze di corrispondenza rispetto a RGB). Quindi l'immagine viene essenzialmente compressa utilizzando un algoritmo wavelet fino a quando sono disponibili solo le caratteristiche più importanti di ogni spazio colore. Questi punti vengono memorizzati in una struttura dati. Le immagini della query seguono lo stesso processo e le caratteristiche principali dell'immagine della query vengono confrontate con quelle del database archiviato. Più corrispondenze, più è probabile che le immagini siano simili.

L'algoritmo è spesso utilizzato per la funzionalità "query by sketch". Il mio software consentiva solo l'inserimento di immagini di query tramite URL, quindi non c'era un'interfaccia utente. Tuttavia, ho scoperto che ha funzionato eccezionalmente bene per abbinare le miniature alla versione grande di quell'immagine.

Molto più impressionante del mio software è retrievr che ti consente di provare l'algoritmo FMIQ utilizzando le immagini di Flickr come fonte. Molto bello! Provalo tramite schizzo o utilizzando un'immagine sorgente e puoi vedere come funziona.


È ancora in grado di riconoscere le immagini ruotate?
endolith

Dubito che funzionerebbe molto bene per quello. Probabilmente vorresti codificare le immagini per ogni rotazione per massimizzare le corrispondenze pertinenti.
Luke Francl

Il collegamento a Retrievr sembra essere interrotto: è archiviato da qualche parte?
mmigdol

10

Un'immagine ha molte caratteristiche, quindi a meno che non te ne restringa una, come la luminosità media, hai a che fare con uno spazio problema n-dimensionale.

Se ti chiedessi di assegnare un unico intero alle città del mondo, così da poter dire quali sono vicine, i risultati non sarebbero eccezionali. Ad esempio, potresti scegliere il fuso orario come numero intero singolo e ottenere buoni risultati con alcune città. Tuttavia, anche una città vicino al polo nord e un'altra città vicino al polo sud possono trovarsi nello stesso fuso orario, anche se si trovano alle estremità opposte del pianeta. Se ti lascio usare due numeri interi, potresti ottenere ottimi risultati con latitudine e longitudine. Il problema è lo stesso per la somiglianza delle immagini.

Detto questo, ci sono algoritmi che cercano di raggruppare immagini simili insieme, che è effettivamente ciò che stai chiedendo. Questo è ciò che accade quando esegui il rilevamento dei volti con Picasa. Anche prima di identificare i volti, raggruppa quelli simili insieme in modo che sia facile passare attraverso una serie di volti simili e dare alla maggior parte di essi lo stesso nome.

Esiste anche una tecnica chiamata Principle Component Analysis, che consente di ridurre i dati n-dimensionali fino a un numero inferiore di dimensioni. Quindi un'immagine con n caratteristiche potrebbe essere ridotta a una caratteristica. Tuttavia, questo non è ancora l'approccio migliore per confrontare le immagini.


1
È un punto controverso, ma PUOI usare un singolo intero per rappresentare la combinazione di un numero qualsiasi di caratteristiche, se, ad esempio, la caratteristica x = 2 e la caratteristica y = 3 e la caratteristica z = 5 e la caratteristica aa = 7, eccetera, allora la potenza alla quale quella base primaria è stata elevata nella forma fattorizzata di un singolo intero sarebbe il valore della caratteristica per quella specifica immagine. Ancora una volta, un punto controverso perché la dimensione del numero sarebbe assurda. Anche se quella dimensione potrebbe essere ulteriormente ridotta ... stiamo solo parlando di dati strutturati.
argyle

Vero. Ma il vero punto è disporre i numeri in modo che immagini simili siano numericamente vicine tra loro. Nonostante quello che ho detto sopra, questo è possibile. In breve, potresti risolvere il problema del venditore ambulante per trovare un percorso minimo (o quasi minimo) attraverso le immagini in uno spazio n-dimensionale (dove n è il numero di caratteristiche che desideri utilizzare per confrontare le immagini). Ma è costoso.
Neil

8

C'è una libreria C ("libphash" - http://phash.org/ ) che calcolerà un "hash percettivo" di un'immagine e ti permetterà di rilevare immagini simili confrontando gli hash (quindi non devi confrontare ogni immagine direttamente contro ogni altra immagine) ma sfortunatamente non sembrava essere molto preciso quando l'ho provato.


5

Devi decidere cosa è "simile". Contrasto? Hue?

Un'immagine "simile" alla stessa immagine è capovolta?

Scommetto che puoi trovare molte "chiamate ravvicinate" rompendo le immagini in pezzi 4x4 e ottenendo un colore medio per ogni cella della griglia. Avresti sedici punteggi per immagine. Per giudicare la somiglianza, dovresti semplicemente fare una somma di quadrati delle differenze tra le immagini.

Non penso che un singolo hash abbia senso, a meno che non sia contro un singolo concetto come tonalità, luminosità o contrasto.

Ecco la tua idea:

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994

Prima di tutto, presumo che questi siano numeri decimali che sono R * (2 ^ 16) + G * (2 ^ 8) + B, o qualcosa del genere. Ovviamente non va bene perché il rosso è ponderato in modo eccessivo.

Andare nello spazio HSV sarebbe meglio. Potresti distribuire i bit di HSV nell'hash, oppure potresti semplicemente sistemare H o S o V individualmente, oppure potresti avere tre hash per immagine.


Un'altra cosa. Se pesate R, G e B. Peso verde più alto, poi rosso, poi blu per corrispondere alla sensibilità visiva umana.


5

Nell'era dei servizi web potresti provare http://tineye.com


3
Il codice dietro tineye sembra essere esattamente quello che sta cercando l'interrogante, ma non penso che come servizio web sia molto utile, dal momento che non c'è un modo (ovvio) per dargli due immagini e chiedere "sono la stessa cosa? " - la seconda immagine dovrebbe essere su una pagina web e indicizzata da tineye
dbr

1
Forse stanno fornendo API per utenti aziendali? Dovrebbero essere contattati in merito.
zproxy

Esiste un'API commerciale che fornisce esattamente quel services.tineye.com/MatchEngine .
Gajus


1

Presumo che altri software di ricerca di immagini duplicate eseguano una FFT sulle immagini e memorizzino i valori delle diverse frequenze come vettori:

Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)

e quindi puoi confrontare due immagini per uguaglianza calcolando la distanza tra i vettori di peso di due immagini:

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);

2
La maggior parte delle immagini naturali ha un contenuto di frequenza molto simile, quindi dubito che questa sarebbe una metrica molto buona.
Hannes Ovrén

1

Una soluzione è eseguire un confronto RMS / RSS su ogni coppia di immagini richieste per eseguire un Bubble sort. In secondo luogo, potresti eseguire una FFT su ciascuna immagine e fare una media degli assi per recuperare un singolo numero intero per ogni immagine che useresti come indice per ordinare. Potresti considerare di fare qualsiasi confronto su una versione ridimensionata (25%, 10%) dell'originale a seconda di quanto piccola differenza scegli di ignorare e di quanto accelerazione desideri. Fammi sapere se queste soluzioni sono interessanti e possiamo discutere o posso fornire un codice di esempio.


FFT fornisce solo informazioni sul colore e nessuna informazione sulla posizione. Il ridimensionamento ignora tutte le caratteristiche al di sotto di una data dimensione indipendentemente dall'impatto sull'immagine risultante. Un'immagine grigia e una scacchiera possono essere identiche sotto quella misura. Un approccio wavelet (Daubechies, Haar, ecc.) Ha il vantaggio di fornire informazioni sulla posizione e sul colore scambiando la proporzione di informazioni sulla posizione e sul colore in ciascun punto dati.
Edward KMETT

2
No, la FFT di un'immagine contiene tutte le informazioni spaziali dell'originale. È possibile ricostruire l'originale dalla FFT. homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Un istogramma, tuttavia, che potrebbe essere ciò a cui stavi pensando, non lo fa.
Paul

1

La maggior parte degli approcci moderni per rilevare il rilevamento di immagini quasi duplicate utilizza il rilevamento di punti interessanti e descrittori che descrivono l'area attorno a tali punti. Spesso viene utilizzato SIFT . Quindi puoi quatizzare i descrittori e utilizzare i cluster come vocabolario visivo delle parole.

Quindi, se vediamo il rapporto tra le parole visive comuni di due immagini e tutte le parole visive di queste immagini, stimerai la somiglianza tra le immagini. Ci sono molti articoli interessanti. Uno di questi è il rilevamento di immagini quasi duplicate: minHash e tf-idf Weighting


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.