2012-04-01 19 views
5

Estoy usando la función Gonzalez frdescp para obtener los descriptores Fourier de un límite. Uso este código y obtengo dos conjuntos de números totalmente diferentes que describen dos formas de escala idénticas pero diferentes.Matlab fourier descriptors ¿Qué pasa?

¿Qué pasa?

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); 

¿Por qué obtengo descriptores diferentes para idénticos, pero diferentes en escala, dos círculos?

+0

de dónde sacaste frdescp? puede ser la fuente del problema – Rasman

+0

Lo obtuve del procesamiento de imágenes digitales de Gonzaelz usando el libro de MATLAB, de hecho, ¡creo que el problema es bwboundaries! –

+0

He editado [mi respuesta anterior] (http://stackoverflow.com/a/23741097/738017), espero que pueda ser útil para usted y otros usuarios. –

Respuesta

6

El problema es que el código frdescp (utilicé this code, que debería ser el mismo que usted) también se escribe para centrar los descriptores de Fourier.

Si desea describir su forma de forma correcta, es obligatorio mantener algunos descriptores que sean simétricos con respecto al que representa el componente de CC.

la imagen siguiente se resume el concepto:

Cut-off of less significant descriptors

Con el fin de resolver su problema (y otros como el suyo), que escribió las siguientes dos funciones:

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 

sé, puede utilizar las funciones anteriores de la siguiente manera:

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

Acabo de pasar por el mismo problema contigo.

De acuerdo con este link, si desea invariante escalar, haga la relación de comparación similar, por ejemplo dividiendo cada coeficiente de Fourier entre el coeficiente de CC. f * 1 = f 1/f [0], f * [2]/f [0], y así sucesivamente. Por lo tanto, debe usar el coeficiente de CC donde f (1) en su código no es el coeficiente de CC real después de su paso "f = f (2:20);% obtiene los primeros 20 & borrando el componente de CC" . Creo que el problema se puede resolver manteniendo primero el valor del coeficiente de CC, el código después de ajustar debe ser el siguiente:

% 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