function Res = Yasnoff3( FicImVT,FicImSeg )
%function Res = Yasnoff3( ImVT,ImSeg )
%besoin de res de seg ajustés 1 à n classes
%
% 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, B. Emile , H. Laurent, 
%"Psychovisual evaluation of an image segmentation result" , 
%8th International IEEE Conference on Signal Processing (ICSP), 2006.



[ImVT PAL]=imread(FicImVT,'BMP');
[ImSeg PAL]=imread(FicImSeg,'BMP');

if (min(min(ImVT))==0)
    ImVT=double(ImVT)+1;
else
    ImVT=double(ImVT);
end;

if (min(min(ImSeg))==0)
    ImSeg=double(ImSeg)+1;
else
    ImSeg=double(ImSeg);
end;

[L,H]=size(ImVT);
taille=L*H;

n1=max(max(ImVT));
n2=max(max(ImSeg));


NBclassSEG=double(max(max(ImSeg)));
NBclassVT=double(max(max(ImVT)));

nbre2lig=size(ImVT,1);
nbre2col=size(ImVT,2);

% calcul des valeurs de recouvrement
T=zeros(NBclassVT,NBclassSEG);
for p=1:NBclassVT
   for o=1:NBclassSEG
      [M N]=find(ImVT(:,:)==p & ImSeg(:,:)==o);
      if (M)
	   	for i=1:length(M)
       	   	p=ImVT(M(i),N(i));
            o=ImSeg(M(i),N(i));
	  	   	T(p,o)=T(p,o)+1;
           end;
        end;
   end;
end;

MatConf=zeros(max(NBclassSEG,NBclassVT));%MatConf(VT,SEG);
MatConfVT =zeros(NBclassVT,1);%MatConf(VT,SEG);
MatConfSeg=zeros(NBclassSEG,1);%MatConf(VT,SEG);

[iT,jT]=size(T);
maxi=zeros(NBclassSEG);
for t=1:NBclassSEG
    maxi(t)=max(max(T));
    for i=1:iT
        for j=1:jT,
            if (maxi(t)==T(i,j))
                cormax=[i,j];
                MatConf(i,j)=T(i,j);
                MatConfVT(i) =j;
                MatConfSeg(j)=i;
            end,
        end,
    end,   
    T(cormax(1),:)=zeros(1,jT);
    T(:,cormax(2))=zeros(iT,1);
end,


Res=0;
for t=1:NBclassSEG
    %disp(t);
    if (MatConfSeg(t)>0) % si la classe t du res de seg a une correspondants dans VT, alors
        [X Y]=find(ImVT==MatConfSeg(t));% on recherche les pixels correspondant dans VT
        [A B]=find(ImSeg==t);% on recherche les pixels de la classe t dans le res de seg
        % et pour chaque pixel de cette classe, on calcule sa distance avec le pixel le plus proche de la VT
        for z=1:length(A)
            if (ImVT(A(z),B(z))~=MatConfSeg(t))
               mini=L*L+H*H;
               for m=1:length(X)
                   tmp=(A(z)-X(m))^2+(B(z)-Y(m))^2;
                   if (tmp<mini)
                       mini=tmp;
                   end;
               end;
                Res=Res+sqrt(mini);
            end;
        end;
    else
        Res=Res+(sqrt(L*L+H*H));
    end;
end;

Res=Res/taille;
disp('Yasnoff3=');
disp(Res);