Suivi des contours en c++

Signaler
Messages postés
25
Date d'inscription
lundi 24 novembre 2008
Statut
Membre
Dernière intervention
17 juin 2011
-
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
-
Salam tt le monde..
je veux obtenir la matrice des suivi des contours d'une image apres la segmentation mais je sais pas comment la faire.
Pour mieux expliquer je dois obtenir a la fin, un fichier qui contient  les coordonnées des pixels du contour..j'ai arriveé à faire la segmentation avec differents methodes mais je sais pas comment continuer pour atteindre mon but.

pouvez vs m'aider??

Remarque : je travaille avec c++

5 réponses

Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Salut
Pour faire cela, il faut utiliser l'algorithme de Freeman. Cet algo te stokera dans un vecteur tous les pixels de ton contour. Il suffira alors de tous écrire dans un fichier.

A+

____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
Messages postés
25
Date d'inscription
lundi 24 novembre 2008
Statut
Membre
Dernière intervention
17 juin 2011

Slt.
merci pour ta reponse....j'ai fait des recherches sur internet concernant cet algorithme de Freeman mais j'ai rien trouvé...
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Voici un exemple d'implémentation de l'algorithme de freeman:

//Next : fonction permettant de selectionner le prochain pixel à traiter dans
//l'algorithme de Freeman.
void Next(int *i,int *j,int *Dir,UCHAR *ucBits,int Width)
{
  int Dir_Recherche;
  int k;
  for(k=0;k<8;k++)
  {
    Dir_Recherche=(*Dir-k-1)%8+1;
    if(Dir_Recherche<=0)
    Dir_Recherche=8+Dir_Recherche;
   
    switch(Dir_Recherche)
    {
     case 1:if(ucBits[((*i+1)+(*j-1)*Width)*4]==255){*i+=1;*j-=1;*Dir=Dir_Recherche; return;}
           break;
     case 2:if(ucBits[((*i)+(*j-1)*Width)*4]==255){*j-=1;*Dir=Dir_Recherche; return;}
           break;   
     case 3:if(ucBits[((*i-1)+(*j-1)*Width)*4]==255){*i-=1;*j-=1;*Dir=Dir_Recherche; return;}
       break;          
     case 4:if(ucBits[((*i-1)+(*j)*Width)*4]==255){*i-=1;*Dir=Dir_Recherche; return;}
       break;
     case 5:if(ucBits[((*i-1)+(*j+1)*Width)*4]==255){*i-=1;*j+=1;*Dir=Dir_Recherche; return;}
       break;
     case 6:if(ucBits[((*i)+(*j+1)*Width)*4]==255){*j+=1;*Dir=Dir_Recherche; return;}
       break;
     case 7:if(ucBits[((*i+1)+(*j+1)*Width)*4]==255){*i+=1;*j+=1;*Dir=Dir_Recherche; return;}
       break;
     case 8:if(ucBits[((*i+1)+(*j)*Width)*4]==255){*i+=1;*Dir=Dir_Recherche; return;}
       break;
    }
  }
  *Dir=-1;

}

//************************************************************************************
//Algorithme de Freeman pour calculer le périmètre de la région.
//On retourne la valeur en µm du perimetre
//************************************************************************************
double CImage::PerimetreFreeman(double ScaleX,double ScaleY)
{
  double Diag,P;
  int i,j,Xini,Yini,Dir;
  BOOL Skip=FALSE;
  queue Fifo;
  for(j=1;j<Height && !Skip;j++)        //placement sur le premier pixel de la région
    for(i=1;i<Width && !Skip;i++)
      if(ucBits[(i+j*Width)*4]==255)
        Skip=TRUE;
   
  P=0.0;
  i--;
  j--;
  if(Skip)
  {
    Xini=i;
    Yini=j;
    Dir=8;
    Next(&i,&j,&Dir,ucBits,Width);
    Fifo.push(Dir);
   
    while(Xini!=i || Yini!=j)
    {
      Dir=(Dir+3-1)%8+1;
      Next(&i,&j,&Dir,ucBits,Width);
      Fifo.push(Dir);
    }
   
    Diag=sqrt(ScaleX*ScaleX+ScaleY*ScaleY);
    do
    {
        Dir=Fifo.front();
        Fifo.pop();
    
      if(Dir==4 ||  Dir==8)        //si paire, on a avancé horizontalement
        P+=ScaleX;
      else if(Dir==2 ||Dir==6)
        P+=ScaleY;            //si paire, on a avancé verticalement
      else
        P+=Diag;            //si impaire, on a avancé en diagonale.
    }
    while(!Fifo.empty());
  }
  return P;   
 
}

A+

____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
Messages postés
3
Date d'inscription
vendredi 27 mars 2009
Statut
Membre
Dernière intervention
31 mai 2009

salut tout le monde
en fait jé le meme probleme ke salma2011  et je voulais utiliser votre programme mais le probleme cété dans la declaration" queue fifo" et ces fonctions
moi je veux enregitrer les coordonnées dans un fihcier texte
je demande si vous pouvez m'aider
et merci en tt cas
cordialement
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Ben dans le dernier do...while(), à chaque fois que tu pop un élement, tu écris ses coordonnées dans un fichier.
A+

____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr