function Res=FOM(ImVT,ImSeg)
% Pratt's Figure Of Merit 
% ImSeg : matrice correspondant à l'image segmentée
% ImRef : matrice correspondant à l'image de Reference (Vérité terrain)
%
% Utilitaires pour l'évaluation de la segmentation d'images
% Toolbox matlab (version 5.3)
%
% (c) Laboratoire de Vision et Robotique (UPRES EA 2078)
% ENSI de Bourges - Université d'Orléans
%
% Sébastien Chabrier : sebastien.chabrier@ensi-bourges.fr
%
%
% Utilitaires pour l'évaluation de la segmentation d'images
% Toolbox matlab (version 5.3)
%
% (c) Laboratoire de Vision et Robotique (UPRES EA 2078)
% ENSI de Bourges - Université d'Orléans
%
% Sébastien Chabrier : sebastien.chabrier@ensi-bourges.fr
%
% Si vous utilisez cette toolbox, veuillez citer ce papier svp.
%
%S. Chabrier, H. Laurent, C. Rosenberger, Y.J. Zhang, 
%"Supervised evaluation of synthetic and real contour segmentation results" , 
%European Signal Processing Conference (EUSIPCO) 2006.


fond=0;
contour=255;
contourVT=255;

Res=0;

ImTmp=and(ImVT,ImSeg);

HVT=IMHIST(ImVT,2);
HSeg=IMHIST(ImSeg,2);
Hand=IMHIST(ImTmp,2);

Ni=HVT(2);
Na=HSeg(2);

Nand=Hand(2);

N=max(Ni,Na);

[M,L]=find(ImVT==contourVT);
TailleVT=length(M);
ContVT=zeros(TailleVT,2);

[M,L]=find(ImSeg==contour);
TailleSeg=length(M);
ContSeg=zeros(TailleSeg,2);


A=size(ImVT);

cpt=1;
cpt2=1;
for x=1:A(1)
   for y=1:A(2)
      if (ImVT(x,y)==contourVT)
	      ContVT(cpt,1)=x;
         ContVT(cpt,2)=y;
         cpt=cpt+1;
      end;
      
      if (ImSeg(x,y)==contour)
	      ContSeg(cpt2,1)=x;
         ContSeg(cpt2,2)=y;
         cpt2=cpt2+1;
      end;
      
   end;
end;

%if (Na>=Ni)
	for i=1:Na
   %	%si ce n'est pas déjà un point contour de la VT
   %  disp(i);
   	if (ImVT(ContSeg(i,1),ContSeg(i,2))~=contourVT)
	   	Dist=ContVT-[ones(TailleVT,1)*(ContSeg(i,1)),ones(TailleVT,1)*(ContSeg(i,2))];% vecteurs distance
	   	Dist2=Dist(:,1).^2+Dist(:,2).^2; % calcul de la distance pour chaque point de la VT
		   [a,b]=min(Dist2(:)); %recherche du point contour VT le plus proche
         Res=Res+1/(1+Dist2(b));
      else
         Res=Res+1;
	   end;
   end;
%else
%	for i=1:Ni
%   	%si ce n'est pas déjà un point contour de la VT
%	%   disp(i);
%   	if (ImSeg(ContVT(i,1),ContVT(i,2))~=contour)
%	   	Dist=ContSeg-[ones(TailleSeg,1)*(ContVT(i,1)),ones(TailleSeg,1)*(ContVT(i,2))];% vecteurs distance
%	   	Dist2=Dist(:,1).^2+Dist(:,2).^2; % calcul de la distance pour chaque point de la VT
%		   [a,b]=min(Dist2(:)); %recherche du point contour VT le plus proche
%         Res=Res+1/(1+Dist2(b));
%      else
%         Res=Res+1;
%	   end;
%   end;
%end;


Res=Res*(1/N);
disp(Res);