Deoarece atunci când calculăm descriptorii Fourier, considerăm valoarea absolută a coeficienţilor transformatei Fourier discrete, alegerea punctului de început nu va afecta valorea lor.
Reamintim că descriptorii Fourier reprezintă forma obiectelor în domeniul frecvenţelor, iar numărul coeficienţilor generaţi de transformată este de obicei mare. Dar numai descriptorii de frecvenţe joase conţin informaţie despre caracteristicile generale ale formei, în timp ce descriptorii de frecvenţe înalte conţin informaţie despre detaliile fine ale formei. De aceea, vectorul caracteristic pentru formă va fi compus, în final, dintr-un număr mic de descriptori Fourier de frecvenţă joasă (am ales 20), aflaţi la începutul şi la sfârşitul secvenţei de descriptori Ck, k=0, …, N-3.
% preprocesarea imaginii: binarizarea si reducerea zgomotului
function bw2=prel_imag(rgbImage,level,d)
bw = im2bw(rgbImage,level);
se = strel('square', d);
bw2 = imdilate(bw,se);
% algoritmul “8-connectivity contour tracing” pentru extragerea % granitei formei obiectului din imagine
function [boundary,nparts]=mvbound(inputimage,neighborhood)
ni=nargin;
no=nargout;
error(nargchk(1,2,ni));
if 2==ni
if ((4~=neighborhood) & (8~=neighborhood))
error('eroare , trebuie 4 sau 8');
end
else
neighborhood=8;
end
if 8==neighborhood
direction=[[0 1];[-1 1];[-1 0];[-1 -1];[0 -1];[1 -1];
[1 0];[1 1] ];
skip=2;
else direction=[ [0 1]; [-1 0]; [0 -1]; [1 0] ];
skip=1;
end
[labeled,nparts]=bwlabel(inputimage,neighborhood);
[x y]=size(labeled);
for i=1 : nparts
image=zeros(x+2,y+2);
image(2:x+1,2:y+1)=(i==labeled);
index=find(image);
if ~isempty(index)
n=1;
d=neighborhood-1;
[a b]=ind2sub(size(image),index(1));
P(n)=a+b*sqrt(-1);
notisolated=(1~=1);
for j=1 : neighborhood
next=[a b]+direction(j,:);
if (1==image(next(1),next(2)))
notisolated=(1==1);
break;
end
end
while notisolated
d=mod(d+neighborhood-skip,neighborhood);
for j=1 : neighborhood
next=[a b]+direction(d+1,:);
if (1==image(next(1),next(2)))
a=next(1);
b=next(2);
n=n+1;
P(n)=a+b*sqrt(-1);
break;
end
d=mod(d+1,neighborhood);
end
if (n>2) & (P(n)==P(2)) & (P(n-1)==P(1))
n=n-2;
break;
end
end
boundary{i}=P(1:n)-1-sqrt(-1);
end
end
% calcularea coeficientilor Fourier
function [S,F]=mvfdesc(R,no_desc,fs)
ni=nargin;
no=nargout;
error(nargchk(1,3,ni));
if 1==nargin
no_desc=-1;
fs=2;
elseif 2==nargin
fs=2;
end
N=length(R);
for i=1 : N
n=length(R{i});
if n<3
error('minim 3 puncte pe granita');
end
if no_desc>=n-2
no_desc=n-2;
end
end
for i=1 : N
n=length(R{i});
S{i}=abs(fft(R{i}))/n;
if n>2
if no_desc <= 0
F{i}=[0:n-1]/n*fs;
xos='Frecventa normalizata ';
yos='Amplitudinea';
elseif no_desc >= n-2
S{i}=S{i}(3:length(S{i}))/S{i}(2);
F{i}=F{i}(3:length(F{i}));
xos='Index descriptori';
yos='Amplitudinea';
else
S{i}=S{i}(3:length(S{i}))/S{i}(2);
k=ceil(no_desc/2);
l=floor(no_desc/2);
m=length(S{i});
S{i}=[S{i}(1:k),S{i}(m-1:m)];
F{i}=[1:length(S{i})];
xos='Index descriptori';
yos='Amplitudinea';
end
end
end
color=['k' 'b' 'y' 'r' 'g' 'm' 'w' 'c'];
if nargout==0
clf;
hold on;
j=0;
for i=1 : N
S{i}
stem(F{i},S{i},color(j+1));
j=mod(j+1,length(color));
end
xlabel(xos);ylabel(yos);
end
% formarea vectorului caracteristic de forma
function T=pattern_vector(rgbImage,prag,d,nd)
I=prel_imag(rgbImage,prag,d);
[b,n]=mvbound(I);
S=mvfdesc(b,nd);
N=length(b);
k=length(S{1});
T=zeros(1,k);
for j=1 : k
for i=1:N,
T(j)=T(j)+S{i}(j);
end
end
for j=1 : k
T(j)=T(j)/N;
end