2016-04-19 10 views
0

Ich möchte Features in zwei Bildern zuordnen, um Kopierfehler zu erkennen. Ich habe die PCA-SIFT code verwendet, um Bildmerkmale zu erkennen. Aber ich habe Probleme mit den PCA-SIFT Funktionen. Laut mehreren Papieren wird für PCA-SIFT ein ähnlicher Matching-Prozess verwendet wie in SIFT. Ich habe das folgende Code-Snippet verwendet, um Features zu vergleichen.Übereinstimmende Funktionen von Bildern mit PCA-SIFT

%des1 and des2 are the PCA-SIFT descriptors obtained from two images 
% Precompute matrix transpose 
des2t = des2';     
matchTable = zeros(1,size(des1,1)); 
cnt=0; %no. of matches 
%ration of ditances 
distRatio = 0.5; 
%normalising features 
m1=max(max(des1)); 
m2=max(max(des2)); 
m=max(m1,m2); 
des1=des1./m; 
des2=des2./m; 
for i = 1 : size(des1,1) 
    %finding eucledian distance of a vector in one image to all features in second image 
    A=des1(i,:); 
    D = des2-repmat(A,size(des2,1),1); 
    [vals,indx] = sort((sum(D.^2,2)).^(1/2)); %sort distances 

    % Check if nearest neighbor has angle less than distRatio times 2nd. 
    if (vals(1) < distRatio * vals(2)) 
     matchTable(i) = indx(1); 
     cnt=cnt+1; 
    else 
     matchTable(i) = 0; 
    end 
end 
cnt 

Der obige Code funktioniert für SIFT Funktionen in Ordnung. Aber ich bin nicht in der Lage, korrekte Ergebnisse für PCA-SIFT-Funktionen zu erhalten, selbst nachdem ich mehrere Werte von distRatio(0-1) ausprobiert habe. Ich bin mir auch nicht sicher, ob der Matlab-Zentralcode für PCA-SIFT (oben erwähnt) den genauen Prozess ausführt, wie in this paper erwähnt. Wenn jemand eine Idee über das obige Problem hat, dann kommentieren Sie bitte.

Antwort

0

Das Problem ist, PCA nicht beibehalten euklidischen Abstand zwischen 2 Vektoren. Nehmen Sie ein einfaches Beispiel, bei dem Ihre Daten entlang der Linie y = x liegen. Der Abstand zwischen zwei Punkten entlang der Linie hängt von beiden Koordinaten ab, selbst wenn alle Ihre Daten 1-dimensional sind, d.h. entlang der Linie liegen. Wenn Sie PCA anwenden, wird die neue euklidische Distanz nur die Hauptkomponente berücksichtigen, die die Linie y = x wäre, also wäre der Abstand zwischen (1,1), (2,2) nur 1 anstelle von sqrt (2).

Wenn Sie jedoch die Merkmale anhand ihrer euklidischen Norm normalisieren, entspricht der nächstgelegene Nachbar, der die euklidische Entfernung verwendet, der Berechnung der Kosinusähnlichkeit (Punktprodukt) zwischen den Merkmalen.

https://en.wikipedia.org/wiki/Cosine_similarity

Deshalb würde ich empfehlen, zunächst zu prüfen, ob für Sift passende Werke kennzeichnet, wenn man sie durch ihre L2-Norm normalisieren. Wenn ja, könnten Sie PCA auf diese Funktionen anwenden, die PCA-Funktionen wieder normalisieren und dann die euklidische Distanz berechnen. Soweit ich mich erinnere, ist die L2-Norm eines Sift-Vektors 1. Sie müssen also nur Ihre PCA-SIFT-Funktionen anhand ihrer L2-Norm normalisieren und die euklidische Distanz berechnen.

Verwandte Themen