Complex Fourier Descriptors
|
Any contour of length \(N\) can be described as a sequence \((x(k),y(k)) k = (0...N)\). We can write this as complex notation: \[ s(k) = x(k) + j\cdot y(k) \] Then transform the function \(s(k)\) in fourier domain to get the complex fourier descriptors \(a\): \[a(u) = \frac{1}{N} \sum_{k=0}^{N-1} s(k) \cdot e^{-\frac{2j\pi uk}{N}}\] The inverse transform with \(M\) fourier descriptors leads to a closed curve contour: \[\hat{s}(u) = \sum_{k=0}^{M-1} a(u) \cdot e^{\frac{2j\pi uk}{N}}\] |
It is possible to distinguish different contours (e.g. Letters) w.r.t their fourier descriptors. Only a few descriptors are necessary so it is easy to compare them.
Here is a octave code to scan a contour and perform fourier descriptors:
function w = window(n,k)
if (rem (n, 2) == 0)
w = [zeros(n/2-k,1) ;ones(2*k,1);zeros(n/2-k,1) ];
else
w = [zeros(n/2-k+1,1) ;ones(2*k,1);zeros(n/2-k,1) ];
endif
endfunction
function R=fd(A,N)
[height, width] = size(A);
% Search begining of object
starty = 0;
startx = 0;
for i = 1:height
for j = 1:width
if (A(i,j)==0)
startx = i;
starty = j;
break;
endif
endfor
endfor
% follow Contur
x = startx;
y = starty;
j = sqrt(-1);
F =[startx + j*starty];
while 1
if(A(x+1,y-1) == 0 && max(ismember(F,((x+1)+j*(y-1)))) == 0 )
F=[F; ((x+1)+j*(y-1))];
x = x+1;
y = y-1;
continue;
elseif(A(x,y-1) == 0 && max(ismember(F,((x)+j*(y-1)))) == 0 )
F=[F; ((x)+j*(y-1))];
x = x;
y = y-1;
continue;
elseif(A(x-1,y-1) == 0 && max(ismember(F,((x-1)+j*(y-1)))) == 0 )
F=[F; ((x-1)+j*(y-1))];
x = x-1;
y = y-1;
continue;
elseif(A(x+1,y) == 0 && max(ismember(F,((x+1)+j*(y)))) == 0 )
F=[F; ((x+1)+j*(y))];
x = x+1;
y = y;
continue;
elseif(A(x-1,y) == 0 && max(ismember(F,((x-1)+j*(y)))) == 0 )
F=[F; ((x-1)+j*(y))];
x = x-1;
y = y;
continue;
elseif(A(x+1,y+1) == 0 && max(ismember(F,((x+1)+j*(y+1)))) == 0 )
F=[F; ((x+1)+j*(y+1))];
x = x+1;
y = y+1;
continue;
elseif(A(x,y+1) == 0 && max(ismember(F,((x)+j*(y+1)))) == 0 )
F=[F; ((x)+j*(y+1))];
x = x;
y = y+1;
continue;
elseif(A(x-1,y+1) == 0 && max(ismember(F,((x-1)+j*(y+1)))) == 0 )
F=[F; ((x-1)+j*(y+1))];
x = x-1;
y = y+1;
continue;
else
break;
endif
endwhile;
R = ifft(ifftshift( fftshift(fft(F)) .* window(size(F),N) ));
endfunction
