Matlab: seuillage avec méthode de Sauvola

noussaa19 Messages postés 18 Date d'inscription jeudi 28 décembre 2000 Statut Membre Dernière intervention 12 avril 2010 - 12 avril 2010 à 13:41
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 12 avril 2010 à 16:01
Salut;
Je suis sur le point de péparer mon PFE, mon projet consiste à détecter les défaut dans des image de la radiographie industrielle avec Matlab.
En effet, j'ai une image en niveau de gris et j'ai appliqué imcrop pour extraire une portion de cette image, puis je veux faire le seuillage de cette image en utilisant l'algorithme de Sauvola. Ce dernier calcule la moyenne et l'écart type pour chaque 15*15 et puis à partir de ces valeur il va calculer la seuille de cette portion de 15*15 et il applique le seuillage de cette portion, je pense il faut ensuite additionner tous ces portions et les rendre une image seuillée.
j'ai esayer de faire le code suivant:
I=imread('68JP.jpg');
figure(1),imshow(I);
I1=imcrop; %sélectionner une portion de l'image
ss=size(I1);%calculer la taille de l'image
Im=I1;
mf=zeros(ss(1),ss(2));

%parcours de l'image à seuiller
for i=1:15:ss(1)
 for j=1:15:ss(2)
     
     h=i;hi=i+15;
     s=j;sj=j+15;
%si la taile de la dernière portion de l'imge est inf à 15
     if(hi>ss(1))
         break;
     end
     if(sj>ss(2))
         break;
     end
%création d'une matrice vide de taille qui vaut à 15*15
     MM=zeros(hi-h,sj-s);

    %copier la portion 15*15 dans une matrice vide
    o=1;
     p=1;
     for m=h:hi
         for n=s:sj
              
                   MM(o,p)=Im(m,n);
                   o=o+1;
                   p=p+1;
               
         end
     end
     
    
     moyen=mean(mean(MM));
     ecart=std(std(MM));
    
     MM=zeros(hi-h+1,sj-s+1);

%calcul du seuil pour la portion 15*15
     seuil(m,n) = moyen *(1 + (1/10)*( 1-( ecart / 256) ));

%appliquer le seuillage sur l'image
k=1;
l=1;
     for k=h:hi
         for l=s:sj
                      disp(k);
             if(Im(k,l)<seuil(m,n)) 
                 %si le pixel inf à seuil, il devient noir
                 mf(k,l)=0;
             end
             if(Im(k,l)>=seuil(m,n))  %si le pixel sup ou egal à seuil, il devient blanc
                 mf(k,l)=256;
             end
         end
     end
 end
end

   
figure(2),imshow(mf);



Le résultat de ce code ne me donne pas un bon seuillage:

http://www.imagup.com/pics/1270893864.html


Comme vous voyez ce n'est pas une bonne résultat alors que dans des pixels particulier elle donne une bonne résultat, je pense que j'ai commis une erreur dans mon code???
Merci de m'aider.

1 réponse

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 avril 2010 à 16:01
Salut

mf(k,l)=256;

en 8 bits c'est mf(k,l)=255 mais l'erreur ne vient pas de la puisque matlab est très/trop tolérant.

Tu verras ici:
http://pacific.mpi-cbg.de/wiki/index.php/Auto_Local_Threshold#Sauvola
que ta formule pour calculer le seuil local est fausse



moyen=mean(mean(MM));
ecart=std(std(MM));

Je ne suis pas sur que ca donne les mêmes résultats que ca:
M=MM(:)
moyen = mean(M)
ecart=std(M);

C'est à tester.


Enfin, qu'est ce que tu cherches à extraire dans ton image? Un simple seuillage ne suffirait pas?
A+
____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
Rejoignez-nous