2012-07-23 10 views
9

Si supponga di avere due immagini. In uno hai una piccola icona (come meno di 300X300 pixel). Il secondo è molto grande, e all'interno hai una (o più) istanze più piccole dell'icona (ovviamente su scala diversa, rotazione).Rilevamento delle funzioni: piccolo elemento in un'immagine grande

L'operazione da eseguire consiste nel trovare le istanze dell'icona nell'immagine grande. Come vorresti che ti avvicinassi a questo?

Ho provato a utilizzare un rilevamento di oggetti basato sulla funzionalità, utilizzando la libreria OpenCV, tuttavia per le immagini grandi e affollate (contenenti molti punti di funzionalità), la corrispondenza è inconcludente. Ho provato gli estrattori di feature SURF/OBJ con gli algoritmi di corrispondenza BRUTE/FLAN.

Dalla mia esperienza sembra che l'abbinamento non prenda nota delle relazioni geometriche tra i punti caratteristica delle due immagini. Come aiuto per la visualizzazione ho allegato un'istanza dei punti caratteristica di due immagini di esempio. enter image description here

Ed ecco un'istanza più difficile del compito. Ho evidenziato l'icona nella grande immagine. enter image description here

+1

Sembra che tu abbia un colore abbastanza distinto. È possibile provare un processo a due fasi in cui si esegue prima la ricerca con il rilevamento blob per quel colore e quindi si trova la sua posa con rilevamento di funzionalità limitato a quella regione per eliminare i falsi positivi. Naturalmente fallirebbe completamente se troppe altre parti dell'immagine fossero di un rosso acceso ... – Hammer

risposta

4

Sulla base di un'esperienza limitata, ho tre raccomandazioni per chiunque altro si imbatta in questo tipo di problema.

1) Esperimento con FindObject by Mathieu Labbé

Si tratta di uno strumento molto bello che mi ha aiutato a sperimentare rapidamente per trovare buone combinazioni di impostazioni per la funzione di rilevamento/descrizione. Basta caricare l'icona come oggetto e caricare le immagini di grandi dimensioni come scene. Quindi modificare fino a ottenere risultati affidabili per la vostra applicazione. Come bonus, ha recentemente aggiunto i metodi BRISK e FREAK per la rilevazione/descrizione delle funzioni non vincolati dai brevetti.

2) ottenere una risoluzione realistica

La risoluzione è così diverso per l'oggetto icona e le icone effettivi nelle grandi scene che si sta cercando. A mio avviso, l'invarianza di scala di questi metodi è in realtà piuttosto limitata. Scopri l'eccellente comparisons done by Ievgen Khvedchenia. È possibile ottenere risultati migliori ridimensionando l'immagine al centro dell'intervallo in cui ci si aspetta che sia.

3) Rendere l'immagine icona del campione più realistica (per esempio, offuscata)

correlati alla # 2, ho scoperto che avere un esempio di immagine molto forte durante la ricerca in una scena più realistica non lo fa lavorare bene. Applico un gaussiano ai miei campioni nitidi per renderli più simili a quello che mi aspetto di trovare. C'è un esempio qui sotto. La strana formula assicura solo che le dimensioni del kernel siano numeri dispari come richiesto.

def proportional_gaussian(image): 
    kernel_proportion = 0.005 
    kernel_w = int(2.0 * round((image.shape[1]*kernel_proportion +1)/2.0)-1) 
    kernel_h = int(2.0 * round((image.shape[0]kernel_proportion +1)/2.0)-1) 
    return cv2.GaussianBlur(image, (kernel_w, kernel_h), 0) 

La speranza che aiuta qualcuno.

2

L'approccio di corrispondenza delle funzionalità è corretto. Se è possibile utilizzare il colore, utilizzare una preelaborazione per trovare la regione di interesse, ad esempio histogram backprojection, seguita dall'estrazione del blob e dall'analisi della forma.

È necessario abbinare tutte le funzioni dall'immagine grande alla piccola immagine. Ciò si traduce in molte partite con pochi inlier.

Poiché l'icona è planare, è possibile utilizzare un'omografia come contraffazione geometrica per le partite. Senza scrivere una singola riga di codice, si può provare l'esempio OpenCV "descriptor_extractor_matcher" che può essere trovato nella directory samples dei sorgenti OpenCV.

./descriptor_extractor_matcher SURF SURF BruteForce NoneFilter icon.jpg image.jpg 3 

Vedere l'output della guida di descriptor_extractor_matcher per ulteriori dettagli.

Si potrebbe provare a cambiare l'ordine delle immagini, non ricordo quale sia l'immagine di allenamento e quale sia l'immagine della query.

La carta su questo tipo di rilevamento di oggetti è "Caratteristiche distintive Immagine da Punti chiave scala-invariante" da David Lowe. Nella sezione 7.3 di questo articolo descrive il suo approccio nel trattare un rapporto molto basso/errato molto basso che sembra essere il tuo caso.

Buona fortuna!

Problemi correlati