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

Traitement d'images Discussion :

Parcourir un contour


Sujet :

Traitement d'images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 97
    Par défaut Parcourir un contour
    Bonjour,

    Je travaille sur une image binaire contenant le contour d un objet. les contours ont été obtenus par l algorithme de Canny.

    Je définis un point départ et un point d arrivée sur ce contour. Mon but est de parcourir le contour du point de départ au point d arrivée, dans un sens donné (si le contour est fermé, on peut aller du départ a l arrivée dans le sens horaire ou antihoraire). Je souhaite stocker les positions des points parcourus, dans l ordre.

    La méthode que j utilise est la suivante :

    - On commence au point de départ.
    - On regarde les 8 voisins du point courant, dans un certain ordre selon le sens de parcours désiré. On recherche les voisins blancs (valant 1).
    - Le premier voisin rencontré sera le pixel courant de l itération suivante. Lors du changement de pixel, j efface l ancien pixel courant pour ne pas retourner dessus et ainsi boucles à infini.
    - On s arête quand le pixel courant est le pixel d arrivée

    Je rencontre plusieurs problèmes :

    - Mon contour peut contenir des "trous" et dans ce cas on ne trouve plus de voisins blanc, on est obligé de s arêter. Une solution pas terrible consiste a relancer la recherche dans un voisinage plus grand.
    - Dans certains cas, le parcours ne se fait pas dans le bon sens (certaines configurations du point de départ). J obtiens alors les points que je ne voulais pas obtenir !

    J espère avoir été relativement clair dans mes explications

    Existe il un algorithme classique permettant de pallier ces problèmes ? Ce problème me semble loin d être simple !

    Merci beaucoup pour votre aide

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par on2101 Voir le message
    - Mon contour peut contenir des "trous" et dans ce cas on ne trouve plus de voisins blanc, on est obligé de s arêter. Une solution pas terrible consiste a relancer la recherche dans un voisinage plus grand.
    Peut-être vaut-il mieux traiter l'image avant de faire le suivi de contour. Par exemple avec de la morphologie mathématique.

    - Dans certains cas, le parcours ne se fait pas dans le bon sens (certaines configurations du point de départ). J obtiens alors les points que je ne voulais pas obtenir !
    Heu... si tu sais définir et détecter ce qu'est le "bon" sens, ca ne pose pas de problème : il suffit d'aller dans l'autre sens.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Salut,

    c'est pas facile comme histoire.

    Il y a cependant plusieurs solutions.

    Au lieu de parcourir un voisinage 3x3 ou NxN, tu peux parcourir ton contour en suivant la normale au gradient en chaque point. Si ton contour ne présente pas de discontinuité (comme un coin) tu peux t'attendre à trouver le point de contour suivant, dans la direction de la normale au gradient. Tu choisis un pas d'avancement le long de cette normale (1 pixel par exemple) et tu calcules les coordonnées réelles du pixel suivant puis tu cherches dans un 3x3 le pixel (coordonnées entières) qui en est le plus proche (faut se fixer une distance maximale tout de même). Des petits trous peuvent être ainsi passés s'ils ne cachent pas une inflexion trop prononcée du contour : il te suffira de continuer la recherche en te prolongeant le long de la même normale d'un pixel de plus ou 2, etc, le tout en augmentant progressivement la taille du voisinage et la distance maximale.

    Autre solution dans l'hypothèse que ton contour est celui d'un ensemble relativement convexe (n'importe quel segment déterminé par 2 points à l'intérieur de ton contour est composé uniquement de points se trouvant à l'intérieur de ton contour). Tu prends le barycentre B de tous tes points. Tu parcours la droite qui passe par B et forme un angle de 0° avec l'horizontale en cherchant un point contour. Puis avec la droite qui passe par B et forme un angle de 1°, puis 2° et etc. Bien évidemment le pas angulaire est à dimensionner en fonction de la taille du contour.

    Sinon pour combler les trous quelque soit la méthode, et si tu as un morceau de contour fiable, tu peux extrapoler ce morceau de contour de manière à te guider dans les zones ou tu as des trous. Extrapolation par splines par exemples à partir des points du morceau de contour fiable. Si le contour ne présente pas de discontinuité, l'extrapolation pourra te permettre de combler des trous relativement conséquents. Si tu as 1 trou entre 2 morceaux de contours fiables et proches une interpolation pareil à partir d'une spline ou autre.

    Toujours dans le cas d'un contour régulier, tu peux t'éviter de travailler sur tous les points mis en évidence par Canny. Tu prends 1 point tous les 5° (angle formé par la droite horizontale et la droite [point-barycentre]) et tu extrapoles le contour à partir de ces points échantillons.

    Ensuite ça dépends de tes contours. Sont-ils répétables, continus, tout ça ?

    Poses-toi également la question de l'intérêt de faire ceci. Est-ce que tu ne peux pas t'en passer ?

    Flo.

Discussions similaires

  1. [VB6] parcourir une arborescence de repertoire
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 17h33
  2. [langage] Parcourir un tableau
    Par Jibees dans le forum Langage
    Réponses: 13
    Dernier message: 22/04/2003, 14h18
  3. [Kylix] contour visible d'un TextRect?
    Par skoupay dans le forum EDI
    Réponses: 1
    Dernier message: 12/03/2003, 12h00
  4. Comment cree une boite de dialogue parcourir
    Par kenshi dans le forum MFC
    Réponses: 5
    Dernier message: 06/01/2003, 10h30
  5. [VB6] [MDI] Parcourir toutes les MDIForms chargées
    Par d.carail dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 04/10/2002, 09h07

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