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:
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:
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!
È necessario utilizzare un comparaison polare registro ... idea se è già implementato in MATLAB o in un toolbox MATLAB ... – Alexxx
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
Questo potrebbe darti alcune idee: [Miglioramento dell'algoritmo per Coca-Cola può dare forma al riconoscimento] (http://stackoverflow.com/q/10168686/2545927) – kkuilla