Domanda

Ho usato il SIFT implementazione di < a href = "http://www.vlfeat.org/overview/sift.html" rel = "nofollow noreferrer"> Andrea Vedaldi , per calcolare i descrittori Sift di due immagini simili (la seconda immagine è in realtà un ingrandito nel quadro dello stesso oggetto da una diversa angolazione).

Ora io non sono in grado di capire come confrontare i descrittori di raccontare quanto simili le immagini sono

So che questa domanda non è responsabile a meno che non si è in realtà giocato con questo genere di cose prima, ma ho pensato che qualcuno che ha fatto prima potrebbe conoscere questo , quindi ho postato la domanda.

il piccolo ho fatto per generare i descrittori:

>> i=imread('p1.jpg');
>> j=imread('p2.jpg');
>> i=rgb2gray(i);
>> j=rgb2gray(j);
>> [a, b]=sift(i);  % a has the frames and b has the descriptors
>> [c, d]=sift(j);
È stato utile?

Soluzione

In primo luogo, non si suppone di utilizzare vl_sift invece di vagliare?

In secondo luogo, è possibile utilizzare SIFT funzione di corrispondenza per trovare corrispondenze nelle due immagini. Ecco alcuni esempi di codice:

    I = imread('p1.jpg');
    J = imread('p2.jpg');

    I = single(rgb2gray(I)); % Conversion to single is recommended
    J = single(rgb2gray(J)); % in the documentation

    [F1 D1] = vl_sift(I);
    [F2 D2] = vl_sift(J);

    % Where 1.5 = ratio between euclidean distance of NN2/NN1
    [matches score] = vl_ubcmatch(D1,D2,1.5); 

    subplot(1,2,1);
    imshow(uint8(I));
    hold on;
    plot(F1(1,matches(1,:)),F1(2,matches(1,:)),'b*');

    subplot(1,2,2);
    imshow(uint8(J));
    hold on;
    plot(F2(1,matches(2,:)),F2(2,matches(2,:)),'r*');

vl_ubcmatch () fa essenzialmente i seguenti:

Supponiamo di avere un punto P in F1 e si desidera trovare la corrispondenza "migliore" in F2. Un modo per farlo è quello di confrontare il descrittore di P in F1 a tutti i descrittori di D2. In confronto, intendo trovare la distanza euclidea (o norma L2 della differenza dei due descrittori).

Poi, ho trovato due punti in F2, dico U e V, che hanno il più basso e distanza secondo più basso (ad esempio, Du e Dv) da P, rispettivamente.

Ecco cosa Lowe consigliata: se Dv / Du> = soglia (ho usato 1.5 nel codice di esempio), allora questa partita è accettabile; in caso contrario, è ambiguo abbinato ed è respinta come una corrispondenza e noi non corrisponde ad alcun punto in F2 per P. In sostanza, se c'è una grande differenza tra le migliori e più seconde migliori partite, ci si può aspettare che questo sia un match di qualità.

Questo è importante, dal momento che c'è un sacco di spazio per le partite ambigue in un'immagine: immaginate punti di corrispondenza in un lago o di un edificio con diverse finestre, i descrittori possono sembrare molto simili, ma la corrispondenza è ovviamente sbagliato

.

Si può fare l'abbinamento in qualsiasi numero di modi .. si può fare da soli molto facilmente con MATLAB o si può accelerarlo utilizzando un KD-albero o un approssimativo di ricerca numero più vicino come FLANN che è stato implementato in OpenCV .

EDIT: Inoltre, ci sono diverse implementazioni KD-albero in MATLAB

Altri suggerimenti

Si consiglia di leggere carta di David Lowe, che parla di come di fare esattamente questo. Dovrebbe essere sufficiente, se si desidera confrontare le immagini di esattamente lo stesso oggetto. Se si desidera far corrispondere le immagini di diversi oggetti della stessa categoria (ad esempio automobili o aeroplani) si consiglia di guardare il Piramide Partita kernel di Grauman e Darrell.

Prova a confrontare ogni descrittore dalla prima immagine con descrittori dal secondo situata in stretta prossimità (utilizzando la distanza euclidea). Così, si assegna un punteggio ad ogni descrittore dalla prima immagine in base al grado di somiglianza tra questo e il più simile descrittore vicino di casa dalla seconda immagine. Una misura statistica (somma, media, dispersione, significherebbe errore, ecc) di tutti questi punteggi si fornisce una stima di quanto simili le immagini sono. Esperimento con diverse combinazioni di dimensioni vicinanze e misura statistica per darvi la migliore risposta.

Se si desidera basta confrontare ingrandito e ruotato immagine con il centro nota di rotazione è possibile utilizzare correlazione di fase in coordinate log-polare. Con la nitidezza del picco e l'istogramma di correlazione di fase si può giudicare quanto vicino le immagini sono. È inoltre possibile utilizzare distanza euclidea sul valore assoluto dei coefficienti di Fourier.

Se si desidera confrontare SIFT descrittore, accanto a distanza euclidea è possibile utilizzare anche "a distanza diffusa" - ottenere descrittore su scala sempre più ruvida e concatenando con descrittore originale. In questo modo caratteristica "su larga scala" somiglianza avrebbe più peso.

Se si vuole fare matching tra le immagini, è necessario utilizzare vl_ubcmatch (nel caso in cui non è stato utilizzato). Si può interpretare 'colonne sonore' l'uscita per vedere quanto vicino le caratteristiche sono. Questo rappresenta il quadrato della distanza euclidea tra la funzione di due corrispondenti descrittore. È inoltre possibile variare la soglia tra le migliori partita e 2 ° miglior partita come input.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top