Riconoscimento del modello a punti


46

Avendo due diverse dimensioni di insiemi di punti (2D per semplicità) disperse in due quadrati di dimensioni diverse, la domanda è:

1- come trovare qualsiasi occorrenza del piccolo attraverso quello grande?
2- Qualche idea su come classificare le occorrenze come mostrato nella figura seguente?

Ecco una semplice dimostrazione della domanda e una soluzione desiderata: inserisci qui la descrizione dell'immagine


Aggiornamento 1:
la figura seguente mostra una visione un po 'più realistica del problema in esame. inserisci qui la descrizione dell'immagine

Per quanto riguarda i commenti, si applicano le seguenti proprietà:

  • posizione esatta dei punti disponibili
  • sono disponibili dimensioni esatte dei punti
    • la dimensione può essere zero (~ 1) = solo un punto
  • tutti i punti sono neri su uno sfondo bianco
  • non esiste alcun effetto scala di grigi / anti-aliasing

Ecco la mia implementazione del metodo presentato endolithcon alcune piccole modifiche (ho ruotato target anziché sorgente poiché è più piccolo e più veloce in rotazione). Ho accettato la risposta di Endolith perché prima ci pensavo. A proposito di RANSAC non ho esperienza finora. Inoltre l'implementazione di RANSAC richiede molto codice. inserisci qui la descrizione dell'immagine


1
Stai cercando una soluzione per abbinare tali punti o per immagini più complesse? Quanti punti potrebbero esserci nelle immagini?

Sì, è molto importante. Se sono solo punti di dimensioni note, puoi ottimizzarlo. Se sono gli indicatori fiduciari che hai il controllo, puoi ottimizzarli. Sii più specifico su cosa stai usando per questo.
endolith,

Per il problema su cui sto lavorando, ci sono serie di punti (ogni diverse centinaia di punti) in cui si sta cercando un altro set di punti di dimensioni inferiori (diciamo <100). La dimostrazione sopra è così semplificata e chiara, tuttavia il vero problema sembra complicato. C'è anche un interesse a trovare le partite classificate in base ai punti indesiderati esistenti tra loro.
Sviluppatore

1
Ci saranno solo punti bianchi e neri? Li stai ricevendo da una fotocamera / scanner / qualcos'altro? I valori binari potrebbero rendere i calcoli molto più veloci.
endolith,

Hai problemi a trovare i centri dei punti o semplicemente a trovare la miniatura nell'immagine grande conoscendo le posizioni dei punti?

Risposte:


17

Questa non è la soluzione migliore, ma è una soluzione. Mi piacerebbe conoscere tecniche migliori:

Se non fossero stati ruotati o ridimensionati, è possibile utilizzare una semplice correlazione incrociata delle immagini. Ci sarà un picco luminoso ovunque l'immagine piccola si presenti nell'immagine grande.

È possibile accelerare la correlazione incrociata utilizzando un metodo FFT, ma se si sta semplicemente abbinando un'immagine di origine piccola con un'immagine di destinazione di grandi dimensioni, il metodo di moltiplicare e aggiungere forza bruta a volte (in genere) è più veloce.

Fonte:

inserisci qui la descrizione dell'immagine

Bersaglio:

inserisci qui la descrizione dell'immagine

Cross-correlazione:

inserisci qui la descrizione dell'immagine

I due punti luminosi sono le posizioni che corrispondono.

Ma voi fare avere un parametro di rotazione dell'immagine ad esempio, in modo che non funziona da solo. Se è consentita solo la rotazione e non il ridimensionamento, è comunque possibile utilizzare la correlazione incrociata, ma è necessario correlare in modo incrociato, ruotare la sorgente, correlarla in modo incrociato con l'intera immagine di destinazione, ruotarla di nuovo, ecc. Per tutte le rotazioni.

Nota che questo non troverà necessariamente l'immagine. Se l'immagine sorgente è un rumore casuale e il bersaglio è un rumore casuale, non lo troverai a meno che non cerchi esattamente l'angolo giusto. Per situazioni normali, probabilmente lo troverà, ma dipende dalle proprietà dell'immagine e dagli angoli in cui si cerca.

Questa pagina mostra un esempio di come sarebbe fatto, ma non fornisce l'algoritmo.

Qualsiasi offset in cui la somma è al di sopra di una certa soglia è una corrispondenza. Puoi calcolare la bontà della partita correlando l'immagine sorgente con se stessa e dividendo tutte le tue somme per questo numero. Una corrispondenza perfetta sarà 1.0.

Questo sarà molto pesante dal punto di vista computazionale, tuttavia, e probabilmente ci sono metodi migliori per abbinare modelli di punti (che vorrei sapere).

Esempio di Python rapido usando la scala di grigi e il metodo FFT:

from __future__ import division
from pylab import *
import Image
import ImageOps

source_file = 'dots source.png'
target_file = 'dots target.png'

# Load file as grayscale with white dots
target = asarray(ImageOps.invert(Image.open(target_file).convert('L')))

close('all')
figure()
imshow(target)
gray()
show()

source_Image = ImageOps.invert(Image.open(source_file).convert('L'))

for angle in (0, 180):
    source = asarray(source_Image.rotate(angle, expand = True))
    best_match = max(fftconvolve(source[::-1,::-1], source).flat)

    # Cross-correlation using FFT
    d = fftconvolve(source[::-1,::-1], target, mode='same')

    figure()
    imshow(source)


    # This only finds a single peak.  Use something that finds multiple peaks instead:
    peak_x, peak_y = unravel_index(argmax(d),shape(d))

    figure()    
    plot(peak_y, peak_x,'ro')
    imshow(d)

    # Keep track of all these matches:
    print angle, peak_x, peak_y, d[peak_x,peak_y] / best_match

Bitmap a 1 colore

Per bitmap a 1 colore, questo sarebbe molto più veloce, però. La correlazione incrociata diventa:

  • Posiziona l'immagine di origine sull'immagine di destinazione
  • Sposta l'immagine sorgente di 1 pixel
    • bit-AND-tutti i pixel sovrapposti
    • sommare tutti gli 1
  • ...

Limitare un'immagine in scala di grigi a binario e quindi farlo potrebbe essere abbastanza buono.

Nuvola di punti

Se l'origine e il target sono entrambi modelli di punti, un metodo più rapido sarebbe quello di trovare i centri di ciascun punto (correlare una volta con un punto noto e quindi trovare i picchi) e memorizzarli come un insieme di punti, quindi abbinare l'origine mirare ruotando, traducendo e trovando l'errore dei minimi quadrati tra i punti più vicini nei due set.


1
Esatto, per il problema in esame non esiste ridimensionamento ma può verificarsi la rotazione. Grazie per il link e la risposta.
Sviluppatore

@Developer: Bene, allora funzionerà, ma probabilmente c'è un modo migliore. Se è solo un'immagine binaria, la correlazione incrociata sarà molto più veloce. (Esiste un FFT per il segnale binario?) La rotazione è arbitraria? Dovresti sperimentare una serie di valori di rotazione che danno buoni risultati, come l'incremento di 1 grado o 5 gradi, ecc.
endolith

1
Sì, è un problema binario. Ricordo anche da qualche parte che esisteva un metodo simile per trovare un segnale più breve modulato su un segnale più lungo con ampiezze diverse. Ricordo a prescindere dalla complessità che funzionava molto bene mostrando i punti di prelievo come punti di inizio delle occorrenze. Dal momento che il problema è in 2D, non mi è chiaro come usare un concetto simile. Questo è anche complicato a causa della rotazione che si applica in 2D.
Sviluppatore

1
Sì, questo diventa impossibile quando si aggiunge la libertà di rotazione. Ecco perché sono stati sviluppati metodi come RANSAC. Penso che aiuta a pensare fuori dagli schemi DSP su questo.
Matt M.

@MattM .: Funziona, è solo lento. :)
endolith,

22

Dal punto di vista della visione artificiale: il problema di base è stimare un'omografia tra il set di punti target e un sottoinsieme di punti nel set grande. Nel tuo caso, solo con rotazione, sarà un'omografia affine. Dovresti esaminare il metodo RANSAC . È progettato per trovare una corrispondenza in un set con molti valori anomali. Quindi, sei armato con due importanti parole chiave, omografia e RANSAC .

OpenCV offre strumenti per il calcolo di queste soluzioni, ma puoi anche utilizzare MATLAB. Ecco un esempio di RANSAC usando OpenCV . E un'altra implementazione completa .

Un'applicazione tipica potrebbe essere quella di trovare una copertina di un libro in una foto. Hai una foto della copertina del libro e una foto del libro su un tavolo. L'approccio non è quello di fare la corrispondenza del modello, ma di trovare gli angoli salienti in ogni immagine e confrontare i set di punti. Il tuo problema sembra essere la seconda metà di questo processo: trovare il punto impostato in una grande nuvola. RANSAC è stato progettato per fare questo in modo robusto.

inserisci qui la descrizione dell'immagine

Immagino che i metodi di correlazione incrociata possano funzionare anche per te poiché i dati sono così puliti. Il problema è che aggiungi un altro grado di libertà con la rotazione e il metodo diventa molto lento.


Ho aggiunto un po 'più di dettagli alla domanda. Controllerò a fondo i tuoi link, tuttavia un'impressione veloce è che sono concetti diversi!
Sviluppatore

1
Sembra che sia davvero un problema di RANSAC / omografia :)
Matt M.

Bene. Era un nuovo concetto per me. Lo proverò al più presto. Se dovessi affrontare delle difficoltà, condividerò con voi membri della comunità fantastici e di supporto.
Sviluppatore

Semplice D: È possibile / fattibile applicare il metodo RANSAC / omografia alla nuvola di punti 3D?
Sviluppatore

Questa non è una soluzione valida. Sfortunatamente la domanda non contiene informazioni sull'intensità e quindi semplici schemi descrittivi non funzionerebbero. Il problema è piuttosto più geometrico di quello.
Tolga Birdal,

3

Se il modello è binario sparso, puoi fare una semplice covarianza di vettori di coordinate invece di immagini. Prendi le coordinate dei punti nella finestra secondaria ordinata a sinistra, crea un vettore da tutte le coordinate e calcola la covarianza con il vettore fatto di coordinate dei punti del modello ordinati a sinistra. Puoi anche usare i pesi. Dopodiché fai in modo che la forza bruta del vicino più vicino cerchi la covarianza massima su una griglia nella finestra grande (e anche la griglia negli angoli di rotazione). Dopo aver trovato le coordinate approssimative con la ricerca, puoi perfezionarle con il metodo del minimo quadrato ripesato.

PS Idea è, invece di lavorare con l'immagine, puoi lavorare con coordinate di pixel diversi da zero. Ricerca comune vicino più vicino. Dovresti fare una ricerca esaustiva di tutto lo spazio di ricerca, sia traslazionale che rotazionale usando una griglia, ovvero un passo nell'angolo delle coordinate e del marciume. Per ogni coordinata / angolo prendi un sottoinsieme di pixel nella finestra con il centro con quella coordinata ruotata di quell'angolo, prendi le loro coordinate (rispetto al centro) e confrontale con le coordinate di pixel del modello che cerchi. Dovresti assicurarti che in entrambi i set i punti siano ordinati allo stesso modo. Trovi le coordinate con la differenza minima (covarianza massima). Dopo quella corrispondenza approssimativa puoi trovare una corrispondenza precisa con un metodo di ottimizzazione. Mi dispiace non posso dirlo più semplice di così.


1
Ci faresti un esempio con più spiegazioni della tua idea? La versione attuale della tua risposta mi confonde.
Sviluppatore

3

Sono molto sorpreso dal fatto che nessuno abbia menzionato i metodi della famiglia General Hough Transform . Risolvono direttamente questo particolare problema.

Ecco cosa propongo:

  1. Prendi il modello e crea la tabella R , indicizzando i bordi del modello. I bordi che seleziono sono i seguenti:

inserisci qui la descrizione dell'immagine

  1. Utilizzare l' implementazione OpenCV predefinita della trasformazione Hough generalizzata per ottenere: inserisci qui la descrizione dell'immagine

dove sono contrassegnate le posizioni corrispondenti. Lo stesso metodo sarebbe comunque funzionale anche se i bordi si riducessero a un singolo punto, poiché il metodo non richiede intensità di immagine.

Inoltre, la gestione delle rotazioni è molto naturale per gli schemi di Hough. In effetti, per il caso 2D, è solo una dimensione aggiunta nell'accumulatore. Nel caso in cui volessi entrare nei dettagli per renderlo davvero efficiente, M. Ulrich spiega molti trucchi nel suo documento .


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.