2012-04-01 12 views
5

Uso la funzione Gonzalez frdescp per ottenere i descrittori di Fourier di un limite. Uso questo codice e ottengo due insiemi di numeri completamente diversi che descrivono due forme identiche ma diverse in scala.Matlab Fourier Descrittori cosa c'è che non va?

Quindi cosa c'è che non va?

im = imread('c:\classes\a1.png'); 
im = im2bw(im); 
b = bwboundaries(im); 
f = frdescp(b{1}); // fourier descriptors for the boundary of the first object (my pic only contains one object anyway) 
// Normalization 
f = f(2:20); // getting the first 20 & deleting the dc component 
f = abs(f) ; 
f = f/f(1); 

Perché ottengo descrittori diversi identici, ma diversi nella scala, due cerchi?

+0

da dove hai preso il frdescp? potrebbe essere la fonte del problema – Rasman

+0

L'ho ottenuto dall'elaborazione delle immagini digitali di Gonzaelz usando il libro MATLAB, in realtà penso che il problema siano i bwboundary! –

+0

Ho modificato [la mia risposta precedente] (http://stackoverflow.com/a/23741097/738017), spero che possa essere utile a voi e ad altri utenti. –

risposta

6

Il problema è che il codice frdescp (ho usato this code, che dovrebbe essere lo stesso di cui si è fatto riferimento) viene scritto anche per centrare i descrittori di Fourier.

Se si desidera descrivere la forma in modo corretto, è obbligatorio mantenere alcuni descrittori simmetrici rispetto a quello che rappresenta il componente CC.

L'immagine seguente riassume il concetto:

Cut-off of less significant descriptors

Al fine di risolvere il problema (e altri come la vostra), ho scritto le seguenti due funzioni:

function descriptors = fourierdescriptor(boundary) 
    %I assume that the boundary is a N x 2 matrix 
    %Also, N must be an even number 

    np = size(boundary, 1); 

    s = boundary(:, 1) + i*boundary(:, 2); 

    descriptors = fft(s); 

    descriptors = [descriptors((1+(np/2)):end); descriptors(1:np/2)]; 
end 

function significativedescriptors = getsignificativedescriptors(alldescriptors, num) 
    %num is the number of significative descriptors (in your example, is was 20) 
    %In the following, I assume that num and size(alldescriptors,1) are even numbers 

    dim = size(alldescriptors, 1); 

    if num >= dim 
     significativedescriptors = alldescriptors; 
    else 
     a = (dim/2 - num/2) + 1; 
     b = dim/2 + num/2; 

     significativedescriptors = alldescriptors(a : b); 
    end 
end 

so, può utilizzare le funzioni di cui sopra come segue:

im = imread('test.jpg'); 
im = im2bw(im); 
b = bwboundaries(im); 
b = b{1}; 

%force the number of boundary points to be even 
if mod(size(b,1), 2) ~= 0 
    b = [b; b(end, :)]; 
end 

%define the number of significative descriptors I want to extract (it must be even) 
numdescr = 20; 

%Now, you can extract all fourier descriptors... 
f = fourierdescriptor(b); 
%...and get only the most significative: 
f_sign = getsignificativedescriptors(f, numdescr); 
2

Ho appena avuto lo stesso problema con te.

In base a questo link, se si desidera eseguire il ridimensionamento in modo invariante, impostare il rapporto di confronto, ad esempio dividendo ogni coefficiente di Fourier per il coefficiente DC. f * 1 = f 1/f [0], f * [2]/f [0] e così via. Pertanto, è necessario utilizzare il coefficiente DC in cui f (1) nel codice non è il coefficiente DC effettivo dopo il passaggio "f = f (2:20);% riceve i primi 20 & eliminando il componente cc" . Penso che il problema possa essere risolto mantenendo il valore del coefficiente DC per primo, il codice dopo aggiustato dovrebbe essere come segue:

% Normalization 
DC = f(1); 
f = f(2:20); % getting the first 20 & deleting the dc component 
f = abs(f) ; % use magnitudes to be invariant to translation & rotation 
f = f/DC; % divide the Fourier coefficients by the DC-coefficient to be invariant to scale 
Problemi correlati