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 :

Problème de Fermeture des contours en Canny


Sujet :

Traitement d'images

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Points : 19
    Points
    19
    Par défaut Problème de Fermeture des contours en Canny
    Bonjour à tous
    Comme le montre l'intitulé, je travaille sur un code Canny pour la détection des contours, les premières démarche fonctionnent bien sauf le seuilllage celle de -fusion- des deux seuil bas ainsi que le haut l'image est toute noire:
    voilà les étapes suivies:

    **Si la norme du gradient est supérieure au seuil haut, c'est un point de contour sûr, qu'on code par 1.
    **Si la norme du gradient est inférieure au seuil bas, alors ce n'est pas un point de contour, qu'on code par 0.
    **Si la norme du gradient est entre les deux, alors c'est un contour de fermeture, i.e un contour potentiel et qu'on code par 2. Ces contours sont transformés en contours sûrs s'ils sont adjacents à un contour codé 1.

    voilà 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
     
     
    /////////////////////////////////Hysteresis////////////////////////////////
    					if(ddddd[g*step+h]>=sh)// || (ddddd[g*step+h]<sb))
    					{
    						ddddd[g*step+h]=1;
    					}
    					if((ddddd[g*step+h]<sh) && (ddddd[g*step+h]>=sb))
    					{
    						ddddd[g*step+h]=2;
    					}
    					if(ddddd[g*step+h]<sb)
    					{
    						ddddd[g*step+h]=0;
    					}
    				}
    			}
    			////////////////////////////////Fermeture//////////////////////////
    			for(g=0;g<H;g++)
    			{
    				for(h=0;h<W;h++)
    				{
    					if(ddddd[g*step+h]==2)
    					{
    						if((ddddd[(g-1)*step+(h-1)]==1) || (ddddd[(g-1)*step+h]==1) || (ddddd[(g-1)*step+(h+1)]==1) || (ddddd[g*step+(h-1)]==1) || (ddddd[g*step+(h+1)]==1) || (ddddd[(g+1)*step+(h-1)]==1) || (ddddd[(g+1)*step+h]==1) || (ddddd[(g+1)*step+(h+1)]==1))
    						{
    							ddddd[g*step+h]=1;
    						}
    					}
    				}
    			}
    qu'est ce qui ne vas pas au juste?
    Merci pour votre attention

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Bonjour,

    Vu le titre de ton topic je ne comprends pas trop ce que tu cherches à faire.
    Si tu es intéressé par la fermeture de contour, je pense que tu peux t'orienter vers la morphologie mathématique en utilisant une fermeture, ou t'orienter vers les méthodes de fermeture automatique.

  3. #3
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par SMI66 Voir le message
    qu'est ce qui ne vas pas au juste?
    Merci pour votre attention
    Il faut ré-appliquer la "fermeture" tant que des points potentiels (2) sont transformés en point du contour (1).

    Ca permet de propager itérativement l'information de contour le long des lignes de points potentiels.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Bonsoir,
    j'ai essayé d'ajouter un nombre d'itération pour que le code de fermeture re-boucle mais ca change toujours pas mon image.

    voilà le code après des petites modifications :
    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
    for(g=0;g<H;g++) {
      for(h=0;h<W;h++) {
        if((ddddd[g*step+h]>sb) && (ddddd[g*step+h]<=sh)) {
          ddddd[g*step+h]=2;
        }
      }
    }
     
    while((compteur==1) && (nbreiteration<tailimg)) {
      for(g=0;g<H;g++) {
        for(h=0;h<W;h++) {
          if(ddddd[g*step+h]==2) {
            if((ddddd[(g-1)*step+(h-1)]==1) || (ddddd[(g-1)*step+h]==1) || (ddddd[(g-1)*step+(h+1)]==1) || (ddddd[g*step+(h-1)]==1) || (ddddd[g*step+(h+1)]==1) || (ddddd[(g+1)*step+(h-1)]==1) || (ddddd[(g+1)*step+h]==1) || (ddddd[(g+1)*step+(h+1)]==1)) {
              ddddd[g*step+h]=1;
              compteur=compteur+5;
            }
          }
        }
      }
      nbreiteration++;
    }
    S'il vous plait s'il vous plait dites moi vos remarques qu 'est ce qui ne marche pas au juste?

    Merci pour votre attention

  5. #5
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par SMI66 Voir le message
    S'il vous plait s'il vous plait dites moi vos remarques qu 'est ce qui ne marche pas au juste?

    Mis à part la variable "compteur" qui empêche la boucle de faire plus d'une itération, ca devrait marcher.

    Bon, c'est loin d'être optimal, mais ca devrait fonctionner.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    La variable "compteur" était ajouté pour reduire le temps d'éxecution.
    Vous dites que ca devrai marcher aprés avoir retirer la variable "compteur" ?

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    J'ai lancé le programme sans utiliser "compteur" et ca tourne tjrs !
    le temps d'execution est vrmt trés grand.

  8. #8
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par SMI66 Voir le message
    La variable "compteur" était ajouté pour reduire le temps d'éxecution.
    Vous dites que ca devrai marcher aprés avoir retirer la variable "compteur" ?
    D'après ce que je comprend du code, oui ca devrait marcher.

    Pour optimiser les performances, il est préférable de ne pas retraiter tous les pixels a chaque itération mais seulement ceux qu'on a promu en HIGH.

    Ca s'implémente très bien avec des listes/FIFO. En pseudocode, ca donnerait un truc du genre
    Code C : 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
    /* les pixels au dessus du seuil haut sont  */
    /* stockés dans une liste (highlist)        */
    for(y=0;y<H;y++) {
      for(x=0;x<W;x++) {
        pixel = image[x][y];
        if (pixel>=HIGH) {
          highlist.push({x,y});
        }
      }
    }
     
    /* pour chaque pixel dans la highlist */
    while( highlist.isempty() == false ) {
      x,y = highlist.pop();
     
      /* explore le voisinage 3x3 */
      neighborhood = get_8_connected(x,y);
      while( neighborhood.isempty() == false ) {
        i,j = neighborhood.pop();
        pixel = image[i][j];
     
        /* si le pixel du voisinage est entre les 2 seuils */
        /* on le considère comme étant HIGH (propagation)  */
        if (pixel>LOW && pixel<HIGH) {
          image[i][j]=HIGH;
          highlist.push({i,j});
        }
      }
     
    }
     
    /* on a parcouru tous les pixels de la highlist */
    /* meme ceux ajoutés par propagation. On a fini */
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Franchement je n'ai pas compris grand chose, en partant du principe de mon programme il est simple et répond aux conditions de fermeture sauf que ca donne pas de résultats pourtant ca doit fonctionner.
    Je suis toute pérdue.
    vous pouvez me simplifier l'algorithme de fermeture.
    Merciii

  10. #10
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par SMI66 Voir le message
    Franchement je n'ai pas compris grand chose, en partant du principe de mon programme il est simple et répond aux conditions de fermeture sauf que ca donne pas de résultats pourtant ca doit fonctionner.
    Je suis toute pérdue.
    vous pouvez me simplifier l'algorithme de fermeture.
    Merciii
    C'est un seuillage par hystérésis, et je ne pense pas qu'on puisse faire plus simple que l'algorithme que tu as donné au post #4.

    En quoi ca ne répond pas aux "conditions de fermeture" ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Le seuillage par hystérésis comme sont nom l'indique va seuiler ton image.
    On l'utilise pour palier les défauts d'un seuillage simple.
    Si tu veux vraiment faire de la fermeture de contour il faut t'orienter vers d'autres méthodes.
    En morphoMath il y a la fermeture qui va combler les vides.
    Sinon il y a des algos qui vont tenter de déterminer le chemin le plus probable que doit suivre le contour, la poursuite de contour (je n'ai jamais essayé).

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    D'après ce que je comprend du code, oui ca devrait marcher.

    Pour optimiser les performances, il est préférable de ne pas retraiter tous les pixels a chaque itération mais seulement ceux qu'on a promu en HIGH.

    Ca s'implémente très bien avec des listes/FIFO. En pseudocode, ca donnerait un truc du genre
    Code C : 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
    /* les pixels au dessus du seuil haut sont  */
    /* stockés dans une liste (highlist)        */
    for(y=0;y<H;y++) {
      for(x=0;x<W;x++) {
        pixel = image[x][y];
        if (pixel>=HIGH) {
          highlist.push({x,y});
        }
      }
    }
     
    /* pour chaque pixel dans la highlist */
    while( highlist.isempty() == false ) {
      x,y = highlist.pop();
     
      /* explore le voisinage 3x3 */
      neighborhood = get_8_connected(x,y);
      while( neighborhood.isempty() == false ) {
        i,j = neighborhood.pop();
        pixel = image[i][j];
     
        /* si le pixel du voisinage est entre les 2 seuils */
        /* on le considère comme étant HIGH (propagation)  */
        if (pixel>LOW && pixel<HIGH) {
          image[i][j]=HIGH;
          highlist.push({i,j});
        }
      }
     
    }
     
    /* on a parcouru tous les pixels de la highlist */
    /* meme ceux ajoutés par propagation. On a fini */

    Bonjour, la variable image dans l'exemple donne est l'image raw en grayscale?
    (car une fois le canny applique on a plus que des pixels noirs/blancs?!)

    Le seuillage par hystérésis comme sont nom l'indique va seuiler ton image.
    On l'utilise pour palier les défauts d'un seuillage simple.
    Si tu veux vraiment faire de la fermeture de contour il faut t'orienter vers d'autres méthodes.
    En morphoMath il y a la fermeture qui va combler les vides.
    Sinon il y a des algos qui vont tenter de déterminer le chemin le plus probable que doit suivre le contour, la poursuite de contour (je n'ai jamais essayé).
    Peux-tu citer des noms d'articles sur le morphoMath?
    En gros je cherche a fermer des contours et supprimer les contours de petites tailles et qui ne matchent pas la forme principale.
    Ma forme principale est approximer par un detourage plus grossier (initialisation de snake) et doit matcher avec le contour de l'image canny.

    Merci de votre aide.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    yes I !

    tiens regarde la page 238 :
    http://www.scribd.com/doc/40552001/3...e-des-contours

Discussions similaires

  1. Problème de Fermeture des contours
    Par SMI66 dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 10/07/2012, 18h25
  2. Fermeture des contours
    Par sanadah dans le forum Images
    Réponses: 6
    Dernier message: 12/05/2009, 20h04
  3. Problème de fermeture des tables
    Par lenetfm dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/08/2008, 13h10
  4. Problème de fermeture de contour
    Par nadjib2007 dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 23/11/2007, 12h16
  5. Fermeture des contours
    Par bahiatoon dans le forum Traitement d'images
    Réponses: 48
    Dernier message: 26/04/2007, 17h45

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