2015-03-18 14 views
5

Ho due immagini simili ma che differiscono per orientamento e dimensioni. Un esempio può essere visto sotto:Corrispondenti immagini con diversi orientamenti e scale in MATLAB

enter image description here enter image description here

C'è un modo per abbinare le due immagini?

Ho utilizzato l'analisi della forma Procrustes, ma ci sono altri modi?

+0

È necessario utilizzare un comparaison polare registro ... idea se è già implementato in MATLAB o in un toolbox MATLAB ... – Alexxx

+2

userei registrazione delle immagini. Trova una serie di punti chiave che corrispondono tra le due immagini, quindi trova una matrice di omografia/trasformazione che allinea i due insieme. A proposito, prima di scrivere una risposta, hai il Toolbox di Computer Vision? – rayryeng

+1

Questo potrebbe darti alcune idee: [Miglioramento dell'algoritmo per Coca-Cola può dare forma al riconoscimento] (http://stackoverflow.com/q/10168686/2545927) – kkuilla

risposta

6

Consultare l'esempio Find Image Rotation and Scale Using Automated Feature Matching nella casella degli strumenti del sistema di visione artificiale.

enter image description here

Essa mostra come rilevare i punti di interesse, estrarre e partite dispone di descrittori, e calcolare la trasformazione tra le due immagini.

+1

@rayryeng, ce ne sono molti. Dovresti controllarli :) http://www.mathworks.com/help/vision/examples.html – Dima

3

si può ottenere un risultato ragionevole nel seguente modo:

  • Rileva SIFT punti in entrambe le immagini. Ad esempio con la lib vlfeat.
  • Incontro descrittori SIFT usando la regola di Lowe, implementato da vlfeat con vl_ubcmatch
  • Usa RANSAC per trovare un sottoinsieme di punti corrispondenti che aderiscono a qualche omografia H. Un esempio utilizzando Harris punti caratteristici possono essere visti sul sito di Peter Kovesi, prossimo a RANSAC stesso e ad altre utili funzioni.

Il risultato iniziale:

enter image description here

17

Ecco qualcosa per iniziare. Quello che stai chiedendo è un classico problema noto come image registration. La registrazione delle immagini cerca di trovare l'omografia corretta che prende un'immagine e la allinea con un'altra. Ciò comporta la ricerca di interessi o punti chiave che sono comuni tra le due immagini e determinare quali punti chiave corrispondono tra le due immagini. Una volta ottenute queste coppie di punti, si determina una matrice di omografia e si deforma una delle immagini in modo che siano allineate con l'altra con questa matrice.

Suppongo che tu abbia gli strumenti di elaborazione del computer e di elaborazione delle immagini che fanno parte di MATLAB. Se non lo fai, allora la risposta che Maurits ha dato è una buona alternativa, e il VLFeat Toolbox è uno che ho anche usato.

In primo luogo, leggiamo nelle immagini direttamente da StackOverflow:

im = imread('http://i.stack.imgur.com/vXqe8.png'); 
im2 = imread('http://i.stack.imgur.com/Pd7pt.png'); 

im_gray = rgb2gray(im); 
im2_gray = rgb2gray(im2); 

abbiamo anche bisogno di convertire in scala di grigio, come gli algoritmi di rilevamento punto chiave richiedono un'immagine in scala di grigi. Successivamente, possiamo usare qualsiasi algoritmo di rilevamento di funzionalità che faccia parte del CVST di MATLAB .... Userò lo SURF poiché è essenzialmente lo stesso di SIFT, ma con alcune differenze minori ma fondamentali. È possibile utilizzare la funzione detectSURFFeatures che fa parte della toolbox CVST e accetta le immagini in scala di grigi. L'output è una struttura che contiene una serie di informazioni su ciascun punto caratteristica dell'algoritmo rilevato per l'immagine. Applichiamo quello a entrambe le immagini (in scala di grigi).

points = detectSURFFeatures(im_gray); 
points2 = detectSURFFeatures(im2_gray); 

Una volta che individuiamo le caratteristiche, è giunto il momento di estratto i descrittori che descrivono questi punti chiave. Questo può essere fatto con extractFeatures. Questo contiene un'immagine in scala di grigi e la struttura corrispondente che è stata prodotta da detectSURFFeatures. L'output è un insieme di funzionalità e punti chiave validi dopo alcuni processi di post-elaborazione.

[features1, validPoints1] = extractFeatures(im_gray, points); 
[features2, validPoints2] = extractFeatures(im2_gray, points2); 

Ora è il momento di abbinare le caratteristiche tra le due immagini. Ciò può essere fatto con matchFeatures e ci vuole nelle caratteristiche tra le due immagini:

indexPairs = matchFeatures(features1, features2); 

indexPairs è una matrice 2D in cui la prima colonna si che dispongono punto dalla prima immagine abbinato con quelli della seconda immagine racconta, memorizzato nella seconda colonna. Lo useremmo per indicizzare nei nostri punti validi per ritagliare ciò che effettivamente corrisponde.

matchedPoints1 = validPoints1(indexPairs(:, 1), :); 
matchedPoints2 = validPoints2(indexPairs(:, 2), :); 

Possiamo quindi vedere che i punti abbinati utilizzando showMatchedFeatures in questo modo. Possiamo mettere entrambe le immagini l'una accanto all'altra e tracciare linee tra i punti chiave corrispondenti per vedere quale abbinato.

figure; 
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage'); 

Questo è ciò che ottengo:

enter image description here

Non è perfetto, ma trova certamente le partite consistenti tra le due immagini.

Ora quello che dobbiamo fare è trovare la matrice di omografia e deformare le immagini. Userò lo estimateGeometricTransform in modo da poter trovare una trasformazione che deformi un insieme di punti in un altro. Come Dima ha notato nei suoi commenti a me di seguito, questo robustamente determina la migliore matrice di omografia tramite RANSAC. Possiamo chiamare estimateGeometricTransform in questo modo:

tform = estimateGeometricTransform(matchedPoints1.Location,... 
    matchedPoints2.Location, 'projective'); 

Il primo ingresso porta in un insieme di ingresso punti, che sono i punti che di trasformare. Il secondo input contiene un set di punti di base che sono i riferimenti punti. Questi punti sono ciò che vogliamo abbinare.

Nel nostro caso, vogliamo distorcere i punti dalla prima immagine - la persona in piedi e farla combaciare con la seconda immagine - la persona appoggiata al fianco, quindi il primo input sono i punti della prima immagine e il secondo input sono i punti della seconda immagine.

Per i punti corrispondenti, vogliamo fare riferimento al campo Location perché contengono le coordinate di dove i punti reali corrispondono tra le due immagini. Usiamo anche projective per tenere conto di scala, cesoiamento e rotazione. L'output è una struttura che contiene la nostra trasformazione dei punti.

Quello che faremo dopo è usare imwarp a ordito la prima immagine in modo che si allinei con il secondo.

out = imwarp(im, tform); 

out conterrà la nostra immagine deformata.Se abbiamo mostrato la seconda immagine e questa uscita lato immagine a fianco:

figure; 
subplot(1,2,1); 
imshow(im2); 
subplot(1,2,2); 
imshow(out); 

Questo è quello che si ottiene:

enter image description here

direi che è abbastanza buono, non credi?


Per la vostra copia e incolla piacere, ecco cosa il codice completo è:

im = imread('http://i.stack.imgur.com/vXqe8.png'); 
im2 = imread('http://i.stack.imgur.com/Pd7pt.png'); 

im_gray = rgb2gray(im); 
im2_gray = rgb2gray(im2); 

points = detectSURFFeatures(im_gray); 
points2 = detectSURFFeatures(im2_gray); 

[features1, validPoints1] = extractFeatures(im_gray, points); 
[features2, validPoints2] = extractFeatures(im2_gray, points2); 

indexPairs = matchFeatures(features1, features2); 

matchedPoints1 = validPoints1(indexPairs(:, 1), :); 
matchedPoints2 = validPoints2(indexPairs(:, 2), :); 

figure; 
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage'); 

tform = estimateGeometricTransform(matchedPoints1.Location,... 
    matchedPoints2.Location, 'projective'); 

out = imwarp(im, tform); 

figure; 
subplot(1,2,1); 
imshow(im2); 
subplot(1,2,2); 
imshow(out); 

parte

Tenete a mente che ho usato il predefinita parametri per tutto ... quindi detectSURFFeatures, matchFeatures, ecc. Potrebbe essere necessario giocare con i parametri per ottenere risultati coerenti su diverse coppie di immagini che si provano. Lo lascerò a te come esercizio. Dai un'occhiata a tutti i link che ho collegato sopra per quanto riguarda ciascuna delle funzioni in modo da poter giocare con i parametri per soddisfare i tuoi gusti.


Buon divertimento e buona fortuna!

+0

'cp2tform' è stato deprecato. Usa 'fitgeotform' per fare un adattamento lineare dei minimi quadrati, o' estimateGeometricTrasnform' per fare un adattamento robusto usando RANSAC. Inoltre, 'imtransform' è stato deprecato a favore di' imwarp'. – Dima

+0

@Dima - 'fitgeotform' Non ce l'ho, motivo per cui ho usato' cp2tform'. Sto usando MATLAB R2013a. Se avessi una versione più recente di MATLAB, utilizzerei sicuramente 'fitgeotform'. Comunque ho "imwarp". FWIW, grazie mille per il suggerimento. – rayryeng

+0

@Dima - Bello. Sembra che abbia 'estimateGeometricTransform'. Ho intenzione di modificare la mia risposta. – rayryeng

0

Questo è piuttosto un approccio diverso rispetto al resto. I metodi di registrazione basati su feature sono più robusti, ma il mio approccio potrebbe essere utile solo per l'applicazione, quindi la scrivo qui.

  • Carica l'immagine di riferimento (lo chiamerò modello) e l'immagine che si desidera confrontare con il modello
  • Calcolare gli istogrammi delle due immagini
  • Confronta i due istogrammi. Ci sono molti modi per farlo. Qui userò l'intersezione e la correlazione
  • Intersezione istogramma: calcola l'intersezione dell'istogramma e normalizza dividendolo per il numero di pixel nell'istogramma del modello. Questo vi darà un valore compreso tra 0 e 1.

    image = imread('Pd7pt.png'); 
    model = imread('vXqe8.png'); 
    grImage = rgb2gray(image); 
    grModel = rgb2gray(model); 
    hImage = imhist(grImage); 
    hModel = imhist(grModel); 
    
    normhistInterMeasure = sum(min(hImage, hModel))/sum(hModel) 
    corrMeasure = corr2(hImage, hModel) 
    
  • Per incrocio e correlazione ottengo 0,2492 e 0.9999, rispettivamente.

Problemi correlati