Suivi des contours en c++

cs_salma2011 Messages postés 25 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 17 juin 2011 - 23 mai 2009 à 23:07
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 3 juin 2009 à 09:12
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

Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
24 mai 2009 à 10:14
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
0
cs_salma2011 Messages postés 25 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 17 juin 2011
24 mai 2009 à 16:47
Slt.
merci pour ta reponse....j'ai fait des recherches sur internet concernant cet algorithme de Freeman mais j'ai rien trouvé...
0
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
25 mai 2009 à 08:33
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
0
primarykey Messages postés 3 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 31 mai 2009
31 mai 2009 à 02:59
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
3 juin 2009 à 09:12
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
0