2013-04-09 3 views
6

La situazione è un po 'unica da tutto ciò che sono stato in grado di trovare già chiesto, ed è la seguente: Se ho scattato una foto di due immagini simili, I' Mi piacerebbe essere in grado di evidenziare le diverse caratteristiche nelle due immagini. Per esempio i seguenti due metà del posto per bambini il gioco differenza:Confronto di immagini simili come fotografie - rilevamento differenza, immagine diff

left half of spot the differenceright half of spot the difference

Le differenze nelle immagini saranno pezzi mancanti/aggiunto e/o cambiamento di colore, e il tipo di differenze che sarebbero facilmente rilevabile dai file di immagine originali facendo niente di più intelligente di un confronto pixel per pixel. Tuttavia, per il fatto che sono soggetti alle fluttuazioni della luce e all'imprecisione della fotografia, avrò bisogno di un algoritmo molto più clemente/intelligente.

Come potete vedere, le immagini non si allineano perfettamente se sovrapposte.

Questa questione è aggiunto indipendente dal linguaggio come mi aspetto risposte che mi puntano verso algoritmi rilevanti, però mi piacerebbe anche essere interessati a implementazioni attuali se esistono, in particolare in Java, Ruby, o C.

risposta

5

Il seguente approccio dovrebbe funzionare. Tutte queste funzionalità sono disponibili in OpenCV. Dai uno sguardo allo this example per le omografie dei computer.

  • Rileva i punti chiave nelle due immagini utilizzando un rivelatore d'angolo.
  • Descrittori di estrazione (SIFT/SURF) per i punti chiave.
  • Abbina i punti chiave e calcola un'omografia utilizzando RANSAC, che allinea la seconda immagine al primo.
  • Applicare l'omografia alla seconda immagine, in modo che sia allineata con la prima.
  • Ora calcola semplicemente la differenza di pixel tra le due immagini e l'immagine della differenza evidenzierà tutto ciò che è cambiato dal primo al secondo.
+0

Ottima risposta chiara, avrò intenzione di implementare qualcosa in OpenCV questa sera. –

+2

Attenzione che un'omografia è quasi rigida: mappa un piano (in 3d) su un piano (non tiene conto delle deformazioni). Nel tuo esempio sopra, risulterebbe in una semplice traduzione globale a destra. Le omografie sono utilizzate per compensare il movimento della telecamera quando la fotocamera sta guardando una superficie planare. – WhitAngl

+1

Sì, secondo. Nell'esempio corrente, sembra che tu corrisponda a un oggetto planare (il dipinto), quindi dovrebbe essere giusto usare le omografie. Ma se si applica questo metodo a oggetti 3D reali, l'omografia verrà calcolata con l'ipotesi che tutte le caratteristiche si trovino sullo stesso piano, il che a sua volta potrebbe fornire un allineamento imprevisto delle immagini. – Zaphod

4

mio l'approccio generale sarebbe quello di utilizzare un flusso ottico per allineare entrambe le immagini ed eseguire un confronto pixel per pixel una volta allineati.

Tuttavia, per gli specifici, i flussi ottici standard (OpenCV ecc.) Potrebbero fallire se le due immagini differiscono in modo significativo come nel tuo caso. Se ciò non funziona, ci sono recenti tecniche di flusso ottico che dovrebbero funzionare anche se le immagini sono drasticamente diverse. Ad esempio, potrebbe essere utile esaminare il documento relativo a SIFT flows by Ce Liu et al che risolve questo problema con corrispondenze sparpagliate.