Come utilizzare l’algoritmo SIFT per calcolare quanto siano simili due immagini?

Ho usato l’implementazione SIFT di Andrea Vedaldi , per calcolare i vagliatori descrittori di due immagini simili (la seconda immagine è in realtà una foto ingrandita dello stesso object da una diversa angolazione).

Ora non sono in grado di capire come confrontare i descrittori per capire quanto siano simili le immagini ?

So che questa domanda non è rispondibile a meno che tu non abbia mai giocato con questo genere di cose prima, ma ho pensato che qualcuno che l’ha già fatto potrebbe saperlo , quindi ho postato la domanda.

il poco che 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); 

Primo, non dovresti usare vl_sift invece di setacciare?

In secondo luogo, è ansible utilizzare la funzionalità di corrispondenza SIFT per trovare le 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 () essenzialmente fa quanto segue:

Supponiamo di avere un punto P in F1 e di trovare la corrispondenza “migliore” in F2. Un modo per farlo è confrontare il descrittore di P in F1 con tutti i descrittori in D2. Per confronto, voglio dire trovare la distanza euclidea (o la norma L2 della differenza tra i due descrittori).

Quindi, trovo due punti in F2, ad esempio U & V che hanno rispettivamente la distanza minima e la seconda più bassa (ad esempio Du e Dv) da P rispettivamente.

Ecco cosa raccomandava Lowe: se Dv / Du> = threshold (ho usato 1.5 nel codice di esempio), allora questa corrispondenza è accettabile; in caso contrario, è equivoco e viene rifiutato come corrispondenza e non corrispondiamo a nessun punto in F2 a P. In sostanza, se c’è una grande differenza tra le migliori e seconde partite, puoi aspettarti che questa sia una corrispondenza di qualità.

Questo è importante poiché c’è molto spazio per le corrispondenze ambigue in un’immagine: immagina punti corrispondenti in un lago o un edificio con più windows, i descrittori possono sembrare molto simili ma la corrispondenza è ovviamente sbagliata.

Puoi fare l’abbinamento in molti modi .. puoi farlo tu stesso molto facilmente con MATLAB o puoi accelerarlo usando un albero KD o una ricerca di numeri approssimati come FLANN che è stata implementata in OpenCV .

EDIT: Inoltre, ci sono diverse implementazioni di kd-tree in MATLAB .

Dovresti leggere il documento di David Lowe, che parla di come fare esattamente questo. Dovrebbe essere sufficiente, se vuoi confrontare le immagini dello stesso identico object. Se vuoi abbinare le immagini di diversi oggetti della stessa categoria (ad es. Auto o aeroplani) potresti voler guardare il Pyramid Match Kernel di Grauman e Darrell.

Cerca di confrontare ciascun descrittore della prima immagine con descrittori del secondo situato in prossimità (utilizzando la distanza euclidea). Pertanto, si assegna un punteggio a ciascun descrittore dalla prima immagine in base al grado di somiglianza tra esso e il descrittore di un vicino più simile dalla seconda immagine. Una misura statistica (sum, media, dispersione, errore medio, ecc.) Di tutti questi punteggi fornisce una stima di quanto siano simili le immagini. Sperimenta con diverse combinazioni di dimensioni delle vicinanze e misure statistiche per darti la risposta migliore.

Se si desidera solo confrontare l’immagine ingrandita e ruotata con il centro di rotazione conosciuto, è ansible utilizzare la correlazione di fase nelle coordinate log-polare. Con la nitidezza del picco e l’istogramma della correlazione di fase puoi giudicare quanto siano vicine le immagini. Puoi anche usare la distanza euclidea sul valore assoluto dei coefficienti di Fourier.

Se si desidera confrontare il descrittore SIFT, accanto alla distanza euclidea si può anche utilizzare la “distanza diffusa” – ottenere un descrittore progressivamente più approssimativo e concatenarli con il descrittore originale. In questo modo la somiglianza di “grande scala” avrebbe più peso.

Se vuoi fare la corrispondenza tra le immagini, dovresti usare vl_ubcmatch (nel caso non lo avessi usato). È ansible interpretare i “punteggi” dell’output per vedere quanto sono vicine le caratteristiche. Rappresenta il quadrato della distanza euclidea tra i due descrittori di funzioni corrispondenti. Puoi anche variare la soglia tra la corrispondenza migliore e la 2a corrispondenza migliore come input.