IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Binarisation par la methode de OTSU


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut Binarisation par la methode de OTSU
    salut a tous : j'ai essayé de programmé la méthode de binarisation by OTSU , j'implémente le programme en C et je l'envoie ensuite sur une cible (carte DSP) mais l'image binarisée que j'obtiens ne correspond pas du tout à l'image initiale.

    quelqu'un pourrait il m'aider à trouver le bug SVP

    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    void Bin_Otsu3( void *_imgsrc, void *_imgdst, uint32 _largeur, uint32 _hauteur )
    {    
     
    	uint16		histogram[256];
    	uint16		omega[256]; 
    	uint32		myu[256];   
     
    	double	max_sigma;
    	double	sigma;          //inter-class variance 
     
    	uint8	i, threshold; 	// threshold for binarization 
    	uint16	n;
    	double	k; 				
     
     
    	uint8	*psrc, *pdst, *pend;
     
    	pend    = (uint8*)_imgsrc + _largeur * _hauteur;
    	n		= _largeur * _hauteur; 	// n = 88 *72 = 6336 pixels 
     
     
    	// Histogram generation 
     
    	for (i = 0; i < 256; i++ )	
    		histogram[ i ] = 0;
     
    	for (psrc = (uint8*)_imgsrc; psrc < pend; psrc++)
    		histogram[ *psrc ]++;
     
     
     
    	// On calcule les deux premiers moments 
    	// myu=moy et omega= ecart-type			
     
    	omega[0] = histogram[0];		
    	myu[0]   = 0;					
     
    	for (i = 1; i < 256; i++) 
    	{
    		omega[i] = omega[i-1] + histogram[i]; 
     
    		myu[i]   = myu[i-1] + i * histogram[i];
    	}
     
     
    	// sigma maximization
     
    	threshold = 0;
    	max_sigma = 0.0;
     
    	for (i = 0; i < 256; i++) 
    	{
    		if ((omega[i] == 0) || (omega[i] == n))
    			sigma = 0.0;
    		else
    		{
    			k = myu[255] * omega[i] - n * myu[i];	
     
     
    			sigma =  (k * k)/ (n * n * omega[i] * (n - omega[i]));	
    		}
     
    		if (sigma > max_sigma) 
    		{
    			max_sigma = sigma;
    			threshold = i;
    		}
    	}
     
    	// binarization with calculated threshold 
     
    	for (psrc = (uint8*)_imgsrc, pdst = (uint8*)_imgdst; psrc < pend; psrc++, pdst++)
    	{
    		*pdst = (*psrc < threshold) ? 0 : 255;
    	}
    }
    MERCI

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Pour commencer, les boucle for me paraissent louches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    uint8 i;
    for (i = 1; i < 256; i++) {
      ...
    }
    et gcc est d'accord avec moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: comparison is always true due to limited range of data type
    puisque i varie entre 0 et 255, il ne sera jamais supérieur ou égal à 256, on ne sertira donc jamais de le boucle.

    De plus, juste pour simplifier le code, plutôt qu'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i = 0; i < 256; i++ )	
      histogram[ i ] = 0;
    pour quoi ne pas initialiser histogram lors de sa déclaration ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uint16 histogram[256] = { 0 };
    Dernière modification par Invité(e) ; 07/08/2008 à 13h35.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut otsu
    jte remercie je vais modifier l'initialisation et voir le résultat.

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par kayser33 Voir le message
    jte remercie je vais modifier l'initialisation et voir le résultat.
    Ma remarque sur l'initialisation était secondaire, le problème vient de la déclaration de i. Il faut que i puisse prendre une valeur supérieure à 255. Il faut donc que i ne soit pas de type uint8, mais au moins uint16.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut otsu
    ah ok! en fait comme i ne prenait que 255 valeurs je me disais qu'un uint8 était largement suffisant mais l'histoire de la boucle infinie je n'y avais pas fait attention.

    j'espère que ça va enfin régler mon problème

    merci à toi et à tous ceux qui prennent le temps de répondre !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut
    en fait tu l'a compilé avec quel logiciel?

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par kayser33 Voir le message
    en fait tu l'a compilé avec quel logiciel?
    gcc sous cygwin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
    Copyright (C) 2004 Free Software Foundation, Inc.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut OTSU
    je relance le sujet sur otsu: en fait la déclaration de la variable i en tant que uint16 n'a pas résolu mon problème hélas!

    quand je teste la méthode de Otsu sur PC j'obtiens de très bons résultats mais des que je l'implémente sur la carte DSP (dc en temps réel) la binarisation est incorrecte.

    Dites moi quels renseignements je peux vous apporter de plus pour que vous puissiez m'aider.

    Merci

  9. #9
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Juste une petite question, combien vaut sizeof (int) sur l'architecture cible (le dsp)?

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Chez moi, l'algorithme semble fonctionner. Le code est il exactement le même entre le plateforme de dev et celle cible ?


    Es tu sur que le problème vient bien de la fonction de binarisation ?

    Est il possible de remplacer le temps d'un test cette fonction par une fonction plus simple (une inversion ou une binarisation à 50 % par exemple) pour être sur que le problème ne vient pas d'ailleurs ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut
    salut stephl : int vaut 32 bits

    Mabu merci d'avoir testé l'algo! j'ai déjà effectué d'autres binarisations à la place de celle la tel qu'un seuillage selon la moyenne et celui fonctionne correctement!

    Le truc c'est que quand je teste les 2 méthodes ci dessus sur Matlab la binarisation de Otsu me donne de meilleurs résultats notamment sur des images peu contrastées, le but étant bien sur que la binarisation soit la plus correcte possible dans des situations variées (contraste, éclairage...)

    Cette binarisation est suivie d'un étiquetage en composante connexe qui est au coeur de mon système donc si la binarisation est médiocre automatiquement mon ECC ne me donnera pas de bons résultats.

  12. #12
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par kayser33 Voir le message
    [...]quand je teste la méthode de Otsu sur PC j'obtiens de très bons résultats [...] Le truc c'est que quand je teste les 2 méthodes ci dessus sur Matlab la binarisation de Otsu me donne de meilleurs résultats
    1. Quand tu dis que tu obtiens de très bons résultats sur pc, est-ce seulement avec matlab ou bien aussi avec le programme c compilé et exécuté sur le pc?

    2. _largeur et _hauteur sont bien de l'ordre de grandeur des valeurs mises en commentaire dans le code?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	n		= _largeur * _hauteur; 	// n = 88 *72 = 6336 pixels
    3. Serait-il possible d'avoir un jeu de données pour lequel le résultat obtenu n'est pas celui escompté?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut
    1) Perso j'ai testé le programme sur Matlab , je l'ai traduit en C , compilé exécuté sur Visual DSP puis transféré sur cible.

    2)largeur= 88 et hauteur = 72

  14. #14
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par kayser33 Voir le message
    1) Perso j'ai testé le programme sur Matlab , je l'ai traduit en C , compilé exécuté sur Visual DSP puis transféré sur cible.
    Veux-tu dire que tu as exécuté le code résultant de ton programme c sur le pc? Ou bien juste sur la cible? Si tu l'as exécuté sur le pc, les résultats étaient-ils identiques à ceux obtenus avec matlab?

    Aurais-tu un exemple de données avec le résultat attendu (données pour lesquelles la binarisation ne fonctionne pas)?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut
    je t'envoie un exemple d'image sur laquelle je cherche a isoler la personne présente . La binarisation est correcte.

    Quand je transfère le programme sur cible l'image binarisée que j'obtiens n'a pas la meme forme.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut
    désolé j'ai oublié de joindre le fichier ;-)

  17. #17
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Je ne vois toujours pas le fichier. L'as-tu joint?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut
    desolé au moment ou je téléchargé les pièces la page internet s'est fermée ! les voici
    Images attachées Images attachées    

  19. #19
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Pas de problème.

    Merci. Cependant, ce n'est pas vraiment ce que j'attendais (je me vois mal reconstuire le tableau d'octets correspondant à l'image rien qu'en la regardant).
    En fait, il me faudrait un fichier contenant les octets de l'image source tels que ta fonction Bin_Otsu3() les reçoit, ainsi qu'un autre fichier contenant les octets de l'image de destination après binarisation (les valeurs correctes calculées par matlab). Bien entendu, il faut qu'il s'agisse d'une image source avec laquelle tu as constaté des résultats différents sous matlab et avec ton programme c tournant sur le dsp.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 11
    Points
    11
    Par défaut
    autant pour moi! je t'envoie les données hexadecimales le plus vite possible!merci

Discussions similaires

  1. Binarisation par la méthode de Otsu
    Par Lost in dans le forum Images
    Réponses: 9
    Dernier message: 28/02/2008, 20h35
  2. url ecrase par une methode get
    Par sam01 dans le forum Langage
    Réponses: 1
    Dernier message: 24/07/2006, 22h35
  3. Envoyer des données par la méthode POST
    Par sorry60 dans le forum Langage
    Réponses: 6
    Dernier message: 31/05/2006, 16h10
  4. Réponses: 4
    Dernier message: 26/05/2006, 18h17
  5. ecriture dans fichier par ma methode print
    Par makohsarah dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 17/05/2006, 20h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo