Domanda

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 con corrispondenze esatte, 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 fornire una misura di quanto simili sono gli screenshot.

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

È stato utile?

Soluzione

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

Ad esempio, ecco alcuni problemi:

  • immagini ritagliate vs.un'immagine non ritagliata
  • immagini con testo aggiunto vs.un altro senza
  • immagini specchiate

Il più facile e semplice algoritmo Ho visto che questo è solo quello di eseguire i seguenti passaggi per 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. ridimensionare le gamme di colori 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 sia il successivo più scuro, quindi in basso a sinistra sia il successivo più scuro (per quanto possibile, ovviamente)

Modificare UN combinando l'algoritmo di ridimensionamento è uno 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 solo.Può essere eseguito con algoritmi come la media, il valore medio o più complessi come le spline bicubiche.

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

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

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

Altri suggerimenti

Il modo "classico" per misurarlo è 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 ciascuna cella e confrontare gli istogrammi corrispondenti.Questo tipo di algoritmo è preferito sia per la sua semplicità che per la sua invarianza al ridimensionamento e alla (piccola!) Traduzione.

Utilizza un istogramma di colori normalizzato.(Leggi la sezione sulle candidature Qui), sono comunemente utilizzati nei sistemi di recupero/abbinamento delle immagini e rappresentano un modo standard per abbinare le immagini che è molto affidabile, relativamente veloce e molto facile da implementare.

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

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

Evitare confronti pixel per pixel poiché se l'immagine viene ruotata/spostata leggermente potrebbe portare alla segnalazione di una grande differenza.

Gli istogrammi sarebbero semplici da generare da soli (supponendo che tu possa avere accesso ai valori dei pixel), ma se non ne hai voglia, il OpenCV La libreria è un'ottima risorsa per fare questo tipo di cose. Qui è una presentazione powerpoint che mostra come creare un istogramma utilizzando OpenCV.

Gli algoritmi di codifica video come MPEG non calcolano la differenza tra ciascun fotogramma di un video in modo da poter codificare semplicemente il delta?Potresti esaminare come gli algoritmi di codifica video calcolano queste differenze di fotogrammi.

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 Correlogramma colore automatico.

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

In ogni caso, l'idea è 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 ognuno i,j Qij = 1 (evitando la divisione zero), Pij = 255, poi per la dimensione nxn, il più grande n sarà, più ci avvicineremo allo zero.(Con un calcolo approssimativo: C=1/n^2).

Avrai bisogno riconoscimento di modelli per quello.Per determinare piccole differenze tra due immagini, Reti di Hopfield funzionano abbastanza bene e sono abbastanza facili da implementare.Non conosco alcuna implementazione disponibile, però.

Una soluzione rubino può essere trovato qui

Dal Leggimi:

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

Il modo in cui misurare la somiglianza tra due immagini dipende interamente da cosa desideri misurare, ad esempio:contrasto, luminosità, modalità, rumore...e poi scegli la misura di somiglianza più adatta a te.Puoi scegliere da PAZZO (media differenza assoluta), MSD (differenza quadratica media) che sono utili per misurare la luminosità... sono disponibili anche CR (coefficiente di correlazione) che è utile per rappresentare la correlazione tra due immagini.Puoi anche scegliere tra misure di somiglianza basate su istogrammi come SDH (deviazione standard dell'istogramma dell'immagine della differenza) o misure di somiglianza multimodale come MI (informazione reciproca) o NMI (informazione reciproca normalizzata).

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

Mi chiedo (e in realtà sto semplicemente lanciando l'idea per poi buttarla giù) se si possa ricavare qualcosa sottraendo un'immagine dall'altra, quindi comprimendo l'immagine risultante come jpeg o gif e prendendo la dimensione del file come una misura di somiglianza.

Se avessi due immagini identiche, otterresti una casella bianca, che si comprimerebbe molto bene.Quanto più le immagini differivano, tanto più complessa sarebbe stata rappresentarla, e quindi meno comprimibile.

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

Potresti guardare il codice per lo strumento open source findimagedupes, anche se sembra essere stato scritto in perl, quindi non posso dire quanto sarà facile analizzarlo...

Leggendo la pagina findimagedupes che mi è piaciuta, vedo che esiste un Implementazione C++ dello stesso algoritmo.Presumibilmente questo sarà più facile da capire.

E sembra che tu possa anche usarlo gqview.

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 abbiano librerie o frammenti di codice disponibili sul loro blog.

per espandere la nota di Vaibhav, abbraccio è un "autostitcher" open source che dovrebbe fornire alcune informazioni sul problema.

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

Beh, un metodo davvero di livello base da utilizzare potrebbe esaminare ogni colore di pixel e confrontarlo con il colore di pixel corrispondente sulla seconda immagine, ma probabilmente è molto molto soluzione lenta.

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 non non ne sono sicuro).Apri entrambe le schermate e posizionane 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.Puoi spostare il livello superiore per ridurre al minimo eventuali differenze di allineamento.

Puoi utilizzare Siamese Network per vedere se le due immagini sono simili o diverse seguendo questo tutorial.Questo tutorial raggruppa le immagini simili mentre puoi utilizzarle L2 distanza per misurare la somiglianza di due immagini.

Al di là del confronto ha un confronto pixel per pixel per le immagini, ad es.

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top