Come posso misurare la somiglianza tra due immagini? [chiuso]


94

Vorrei confrontare uno screenshot di un'applicazione (potrebbe essere una pagina Web) con uno screenshot acquisito in precedenza per determinare se l'applicazione viene visualizzata correttamente. Non voglio un confronto della corrispondenza esatta, perché l'aspetto potrebbe essere leggermente diverso (nel caso di un'app Web, a seconda del browser, alcuni elementi potrebbero trovarsi in una posizione leggermente diversa). Dovrebbe dare una misura di quanto sono simili gli screenshot.

Esiste una libreria / uno strumento che lo fa già? Come lo implementeresti?


1
Ci sono alcune buone risposte in questa altra domanda simile: stackoverflow.com/questions/75891/…
blak


1
È ora di aggiornare le risposte alla luce dei recenti progressi nel Machine Learning e più specificamente nel "Deep Learning".
jldupont

Anche il mio laboratorio doveva risolvere questo problema e ha utilizzato il flusso di lavoro delineato qui: douglasduhaime.com/posts/…
duhaime

Risposte:


73

Dipende interamente da quanto intelligente vuoi che l'algoritmo sia.

Ad esempio, ecco alcuni problemi:

  • immagini ritagliate rispetto a un'immagine non ritagliata
  • immagini con un testo aggiunto rispetto a un altro senza
  • immagini speculari

L' algoritmo più semplice e semplice che ho visto per questo è solo quello di eseguire i seguenti passaggi su ciascuna immagine:

  1. ridimensionare a qualcosa di piccolo, come 64x64 o 32x32, ignorare le proporzioni, utilizzare un algoritmo di ridimensionamento combinato invece del pixel più vicino
  2. scalare gli intervalli di colore in modo che il più scuro sia il nero e il più chiaro sia il bianco
  3. ruotare e capovolgere l'immagine in modo che il colore più chiaro sia in alto a sinistra, quindi in alto a destra è il prossimo più scuro, in basso a sinistra è il prossimo più scuro (per quanto possibile ovviamente)

Modifica Un algoritmo di ridimensionamento combinato è quello che quando si ridimensiona 10 pixel fino a uno lo farà utilizzando una funzione che prende il colore di tutti quei 10 pixel e li combina in uno. Può essere eseguito con algoritmi come la media, il valore medio o più complessi come le spline bicubiche.

Quindi calcolare la distanza media pixel per pixel tra le due immagini.

Per cercare una possibile corrispondenza in un database, memorizzare i colori dei pixel come singole colonne nel database, indicizzarne un gruppo (ma non tutti, a meno che non si utilizzi un'immagine molto piccola) ed eseguire una query che utilizzi un intervallo per ciascuno valore pixel, ad es. ogni immagine in cui il pixel nell'immagine piccola è compreso tra -5 e +5 dell'immagine che si desidera cercare.

Questo è facile da implementare e abbastanza veloce da eseguire, ma ovviamente non gestirà le differenze più avanzate. Per questo hai bisogno di algoritmi molto più avanzati.


14
Che cos'è un "algoritmo di scalatura combinata"?
Gregg Lind

32

Il modo "classico" di misurare questo è quello di suddividere l'immagine in un numero canonico di sezioni (ad esempio una griglia 10x10) e quindi calcolare un istogramma di valori RGB all'interno di ogni cella e confrontare gli istogrammi corrispondenti. Questo tipo di algoritmo è preferito sia per la sua semplicità che per la sua invarianza rispetto al ridimensionamento e alla (piccola!) Traduzione.


6
Non è simile a fare un singolo istogramma per l'intera immagine, ma con gli svantaggi aggiunti di non essere resiliente per specchiarsi e ruotare?
dodgy_coder

2 istogrammi da 2 metà dell'immagine avranno una precisione di corrispondenza migliore rispetto a 1 istogramma di un intero. Sebbene abbia degli svantaggi che hai menzionato, dipende dal problema che stai risolvendo.
psycho brm

25

Usa un istogramma di colore normalizzato. (Leggi la sezione sulle domande qui ), sono comunemente utilizzati in recupero di immagini / sistemi corrispondenza e sono un modo standard di immagini di corrispondenza che è molto affidabile, relativamente veloce e molto facile da implementare.

Essenzialmente un istogramma di colore catturerà la distribuzione del colore dell'immagine. Questo può quindi essere confrontato con un'altra immagine per vedere se le distribuzioni dei colori corrispondono.

Questo tipo di corrispondenza è abbastanza resistente al ridimensionamento (una volta normalizzato l'istogramma), rotazione / spostamento / movimento ecc.

Evita i confronti pixel per pixel poiché se l'immagine viene ruotata / spostata leggermente potrebbe portare a una grande differenza.

Gli istogrammi sarebbe semplice per generare te stesso (supponendo che si può ottenere l'accesso ai valori dei pixel), ma se non avete voglia di esso, l'OpenCV biblioteca è una grande risorsa per fare questo genere di cose. Ecco una presentazione powerpoint che mostra come creare un istogramma usando OpenCV.


14

Gli algoritmi di codifica video come MPEG non calcolano la differenza tra ogni fotogramma di un video in modo che possano semplicemente codificare il delta? Potresti esaminare in che modo gli algoritmi di codifica video calcolano queste differenze di frame.

Guarda questa applicazione di ricerca di immagini open source http://www.semanticmetadata.net/lire/ . Descrive diversi algoritmi di somiglianza delle immagini, tre dei quali provengono dallo standard MPEG-7: ScalableColor, ColorLayout, EdgeHistogram e Auto Color Correlogram.


1
Questo non risponderebbe alla domanda qui. La domanda non riguarda il confronto pixel per pixel.
Kousha

@ Kousha Vero, ma comunque una direzione interessante per pensare.
significato-conta

13

Potresti usare un approccio matematico puro di O(n^2), ma sarà utile solo se sei certo che non ci sia offset o qualcosa del genere. (Anche se questo, se hai pochi oggetti con una colorazione omogenea, funzionerà comunque abbastanza bene.)

L'idea è comunque quella di calcolare il prodotto scalare normalizzato delle due matrici. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Questa formula è in realtà il "coseno" dell'angolo tra le matrici (strano). Maggiore è la somiglianza (diciamo Pij=Qij), C sarà 1, e se sono completamente diversi, diciamo per ogni i,j Qij = 1(evitando la divisione zero) Pij = 255, quindi per la dimensione nxn, maggiore nsarà, più vicino a zero saremo ottenere. (Con un calcolo approssimativo:) C=1/n^2.



7

Una soluzione di rubino può essere trovata qui

Dal readme:

Phashion è un wrapper Ruby attorno alla libreria pHash, "hash percettivo", che rileva file multimediali duplicati e quasi duplicati


5

Come misurare la somiglianza tra due immagini dipende interamente da ciò che vorresti misurare, ad esempio: contrasto, luminosità, modalità, rumore ... e poi scegli la misura di somiglianza più adatta che c'è per te. Puoi scegliere tra MAD (differenza media assoluta), MSD (differenza quadratica media) che sono buoni per misurare la luminosità ... è disponibile anche CR (coefficiente di correlazione) che è buono per rappresentare la correlazione tra due immagini. È anche possibile scegliere tra misure di somiglianza basate su istogrammi come SDH (deviazione standard dell'istogramma dell'immagine di differenza) o misure di somiglianza multimodale come MI (informazione reciproca) o NMI (informazione reciproca normalizzata).

Poiché queste misure di somiglianza costano molto nel tempo, si consiglia di ridimensionare le immagini prima di applicare queste misure su di esse.


4

Mi chiedo (e sto solo buttando l'idea là fuori per essere abbattuta) se qualcosa potrebbe essere derivato sottraendo un'immagine dall'altra e quindi comprimendo l'immagine risultante come jpeg di gif e prendendo la dimensione del file come una misura di somiglianza.

Se avessi due immagini identiche, otterrai una casella bianca, che si comprimerebbe molto bene. Più le immagini differivano, più sarebbe complesso rappresentarle e quindi meno comprimibili.

Probabilmente non è un test ideale e probabilmente molto più lento del necessario, ma potrebbe funzionare come un'implementazione rapida e sporca.


Pensa alla rotazione di 90 gradi; le immagini sono ancora simili.
significato-conta


2

Beh, non per rispondere direttamente alla tua domanda, ma l'ho visto accadere. Microsoft ha recentemente lanciato uno strumento chiamato PhotoSynth che fa qualcosa di molto simile per determinare le aree sovrapposte in un gran numero di immagini (che potrebbero avere proporzioni diverse).

Mi chiedo se hanno librerie disponibili o frammenti di codice sul loro blog.


1
Questa tecnologia. è stato interrotto.
Joseph Rosson

2

per espandere la nota di Vaibhav, hugin è un 'autostitcher' open source che dovrebbe avere alcune informazioni sul problema.


2

C'è un software per il recupero delle immagini basato sul contenuto, che fa (parzialmente) ciò di cui hai bisogno. Tutti i riferimenti e le spiegazioni sono linkati dal sito del progetto e c'è anche un breve libro di testo (Kindle): LIRE


1

Puoi utilizzare Siamese Network per vedere se le due immagini sono simili o dissimili seguendo questo tutorial . Questo tutorial raggruppa le immagini simili mentre puoi usare la L2distanza per misurare la somiglianza di due immagini.


0

Se questo è qualcosa che farai occasionalmente e non necessita di automazione, puoi farlo in un editor di immagini che supporti i livelli, come Photoshop o Paint Shop Pro (probabilmente anche GIMP o Paint.Net, ma io ' Non sono sicuro di quelli). Apri entrambe le schermate e mettine una come livello sopra l'altra. Cambia la modalità di fusione dei livelli in Differenza e tutto ciò che è uguale tra i due diventerà nero. È possibile spostare il livello superiore per ridurre al minimo eventuali differenze di allineamento.


Un altro strumento che rende questo tipo di differenza molto semplice è kaleidoscopeapp.com
Michael Osofsky

0

Beyond Compare offre un confronto pixel per pixel per le immagini, ad es.

inserisci qui la descrizione dell'immagine


@xilpex, l'OP chiede: esiste una libreria / strumento che lo fa già ? La mia risposta include un collegamento a tale libreria / strumento.
emallove

-1

Bene, un metodo di livello base da utilizzare potrebbe passare attraverso ogni colore di pixel e confrontarlo con il colore di pixel corrispondente sulla seconda immagine, ma questa è probabilmente una soluzione molto molto lenta.

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.