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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    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 à 12h35.

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    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 averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    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 averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    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.

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

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

  9. #9
    Membre émérite 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
    Par défaut
    Je ne vois toujours pas le fichier. L'as-tu joint?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    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    

  11. #11
    Membre émérite 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
    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.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    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, 19h35
  2. url ecrase par une methode get
    Par sam01 dans le forum Langage
    Réponses: 1
    Dernier message: 24/07/2006, 21h35
  3. Envoyer des données par la méthode POST
    Par sorry60 dans le forum Langage
    Réponses: 6
    Dernier message: 31/05/2006, 15h10
  4. Réponses: 4
    Dernier message: 26/05/2006, 17h17
  5. ecriture dans fichier par ma methode print
    Par makohsarah dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 17/05/2006, 19h26

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