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

Algorithmes et structures de données Discussion :

[image] Problème de suppression des max locaux avec Canny


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Par défaut [image] Problème de suppression des max locaux avec Canny
    Bonjour,

    En fait j'ai une question sur l'algo de canny, au moment ou on à reduit l'angle gradient à 4 secteurs bien précis, on doit ensuite suprimer les maximas locaux à l'aide des images d'amplitudes et de directions des gradients...

    l'algo dit:
    Pour chaque point de l'image A(i,j) (amplitude gradient) on détermine les deux points adjacents A1(i,j) et A2(i,j) qui sont dans la direction du gradient.

    Si A(i,j) est supérieur a la fois à A1(i,j) et A2(i,j) alors A(i,j) est conservé, sinon A(i,j) est annulé.
    Je n'arrive pas à déterminer correctement les deux points adjacents qui sont "dans la direction du gradient" pour faire le test comparatif avec A(i,j).

    Quelqu'un pourrai m'expliquer comment j'implemente ça?
    merci.

  2. #2
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Euh...

    Il me semblait que dans l'algo de Canny on filtrait dans chaque direction avant de faire une sorte de moyenne sur toutes les directions...

    Ce qui voudrait dire que c'est toi qui connaît la direction à donner à ton filtrage et par conséquent à ton gradient, non ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Par défaut
    Dans l'algo que j'ai trouvé , on me dit de faire un filtrage Sobel dans deux directions (x,y) ce qui me donne deux images (Gx, Gy) avec ces deux images je calcul l'amplitude du gradiant Ga= racine (gx*gx+gy*gy) et la direction du gradient Gd= Atan2 (Gy,Gx) // Tan-1 (y/x) avec gestion des / par 0.

    ensuite je réduit les angles de Gd à 4 directions (0°,45°,90°,135°) qui sont respectivement les secteur suivant (0, 1, 2, 3), ensuite l'algo me dit qu'il faut que je compare Gd avec Ga et qu'en fonction de la direction du gradiant (Gd) je doit déterminé les deux pixel (voisinage 3x3) voisin au pixel étudié. Si un des deux pixels voisin est supérieur au pixel étudié je dois le mettre égal au fond (0).

    Une fois terminé je dois faire un seuillage par hystérésis.

    Voila la méthode, mais je n'arrive pas à implémenter correctement la parti ou il faut testé les pixel voisin qui sont sur l'axe de direction du gradient, car j'ai jamais vue ce genre d'algo et que je ne suis pas sur de bien tout comprendre..

    revoici le chemin pour l'algo que j'ai trouvé:

    http://www.pages.drexel.edu/~weg22/can_tut.html

    si je ne suis pas assez explicite n'hésitez pas à me le dire...

    merci

  4. #4
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Salut,
    (Désolé de répondre si tard, le weekend a été long...)

    Si j'ai bien compris, tu ne comprends pas comment faire le calcul dans une direction donnée ?

    Bah une fois que tu as calculé la direction, tu approximes par la plus proche des 4 directions... Ex : si tu trouves theta = 50°, tu approximes par theta = 45 °...
    En fait on fait ça car les angles que l'on peut prendre sur la grille discrète (cad finie cad le contraire de continue) ne peuvent être que 0, 45, 90 et 135 °...

    si je schématise par '$' la direction à prendre, ça donne :
    0° =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    x     x     x     x     x
    x     x     x     x     x
    $     $     a     $     $
    x     x     x     x     x
    x     x     x     x     x
    45° =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    x     x     x     x     $
    x     x     x     $     x
    x     x     a     x     x
    x     $     x     x     x
    $     x     x     x     x
    90° =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    x     x     $     x     x
    x     x     $     x     x
    x     x     a     x     x
    x     x     $     x     x
    x     x     $     x     x
    135° =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $     x     x     x     x
    x     $     x     x     x
    x     x     a     x     x
    x     x     x     $     x
    x     x     x     x     $
    C'est plus clair ??

    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Par défaut
    En fait ce que je ne comprennais pas c'était ce qui suivait, dis moi si je me trompe:

    Une fois que tu as ton image des amplitudes de gradiant (Ga(i,j)) et ton image des directions de gradiant (Gd(i,j)), tu veux ne garder qu'une seule ligne de contour et donc on utilise la méthode de supression des non-mamima locaux, et là encore, si j'ai bien compris on parcour Ga(i,j) et quand on à un contour, on regarde la direction dans Gd(i,j), on revient dans Ga(i,j) et on regarde si les pixels voisins du pixel étudier, qui sont sur l'axe de direction du gradient donné par Gd(i,j), sont bien inférieur au niveau de gris du pixel étudié. Si c'est pas le cas on le met à zéro...

    mais mon problème est bien plus complexe maintenant car si je regarde mon image après un traitement de canny, on voit qu'il n'y a pas toutes les directions.. quand j'applique la transformée de Hough, je n'ai que les lignes perpendiculaires aux directions 0° et 45°, ce qui est bizzard quand tu vois que mon image est composé d'un cercle assez grand!!!

    Je suis un peux perdu dans mon algo... aurrai tu un algo avec les étapes assez précise des méthodes utilisé pour faire une détection de contour avec Canny pour voir si je n'ai rien oublié? Et par la même occasion si tu aurais celui de la transformée de hough ce ne serai pas de refus...

    merci pour ton aide car je patauge un peu.

  6. #6
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Citation Envoyé par Rafoo
    Une fois que tu as ton image des amplitudes de gradiant (Ga(i,j)) et ton image des directions de gradiant (Gd(i,j)), tu veux ne garder qu'une seule ligne de contour et donc on utilise la méthode de supression des non-mamima locaux, et là encore, si j'ai bien compris on parcour Ga(i,j) et quand on à un contour, on regarde la direction dans Gd(i,j), on revient dans Ga(i,j) et on regarde si les pixels voisins du pixel étudier, qui sont sur l'axe de direction du gradient donné par Gd(i,j), sont bien inférieur au niveau de gris du pixel étudié. Si c'est pas le cas on le met à zéro...
    Je crois que c'est ça...

    mais mon problème est bien plus complexe maintenant car si je regarde mon image après un traitement de canny, on voit qu'il n'y a pas toutes les directions.. quand j'applique la transformée de Hough, je n'ai que les lignes perpendiculaires aux directions 0° et 45°, ce qui est bizzard quand tu vois que mon image est composé d'un cercle assez grand!!!
    C'est pas une histoire du problème de seuillage trop fort ? (dans l'algo de canny, tu utilises il me semble un filtrage du genre 'la première dérivée' de la gaussienne de variance sigma...). Si je me souviens biens (j'ai bien dit "si"), ce sigma est très important : plus il est élevé et plus tu détectes les changements basse fréquence... Plus il est faible et plus tu détectes les changements haute fréquence (le bruit par exemple)...

    Donc baisse un peu ce sigma, ça te donnera peut-être des choses meilleures...

    Et puis rien ne te garantit d'avoir des contours fermés avec Canny (j'imagien que c'est pour ça que tu utilises Hough derrière)... On atteint là les limites de cet algo : contours non fermés et utilisation de sigma délicate...

    A+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Par défaut
    Donc baisse un peu ce sigma, ça te donnera peut-être des choses meilleures...
    J'ai pris le filtre gaussien donné dans le site, mais je ne sais pas recalculer ce filtre pour avoir un sigma moin fort...

    Aurais-tu 5 minute pour m'expliquer comment on fait?

    merci.

  8. #8
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Disons que ça prendra pas 5 min...

    Le filtrage de Sobel correspond à un filtrage par la première dérivée d'une gaussienne avec un sigma = 1 je crois...
    Mais le gros problème c'est que ce type de filtrage est très approximatif car la fenêtre (3x3 ou même 5x5) est trop petite...

    Le mieux c'est d'utiliser un filtrage récursif (par opposition avec le filtrage du genre de Sobel qui utilise une fenêtre finie, on utilise un support infini) en implémentant directement la formule de la 1ère dérivée d'une gaussienne... Je dois avoir des sources quelque part en C++ si ça t'intéresse...
    Là, tu pourras règler ce sigma comme tu veux...

    A+

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Par défaut
    Ok je suis partant pour tester ton code mathieu...

    Une autre petite question, quand on utilise la détection de contour de Canny, on n'utilise que deux directions des filtres de sobel pour obtenir la direction du gradiant dans l'image? parce que moi avec les direction en i, j je n'obtiens que les directions entre 0 et Pi/8 et entre 2*Pi/8 et 3*Pi/8, donc du coup avec hough je n'obtiendrai que des lignes dans la direction de 90° et 135°??? J'ai essayé d'appliquer sobel dans quatre direction mais du coup je ne sais pas comment calculer l'ATAN pour obtenir les directions des gradiants...

    Parceque je me demande si c'est seulement un problème de règlage du sigma... Vue que le filtre gaussien est uniforme dans toutes les directions, je devrais au moins obtenir toutes les directions de mon image??

    Comment on fais alors??? HELP HELP HELP!!!

    Encore merci

  10. #10
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Salut,

    Pour le code il faut attendre un peu, je l'ai c'est sûr mais il faut que je cherche un peu (je pense que je te donnerai ça pour demain)...

    Pour les histoires de directions... Il me semble (je dis ça car je ne parle que sur la base de mes souvenirs, j'ai pas trop le temps de m'y replonger) que les deux directions suffisent, même si c'est sûr que si tu filtres dans plus de directions c'est plus robuste...

    Je pense vraiment que ça vient du sigma (mais c'est quand même à vérifier)... Et non le filtre n'est pas uniforme dans toutes les directions car comme tu l'as dit tu ne filtres que dans des directions privilégiées (on tente de généraliser la gaussienne 1D à la 2D mais c'est une approximation.... la vraie généralisation est une fonction "sombréro" plus complexe donc moins facile à mettre en oeuvre)...
    Donc c'est peut-être dû à ça : les directions privilégiées plus un sigma mal règlé pourraient sans doute occasionner ce que tu décris (mais encore une fois ce ne sont que des suppositions...).

    Mais au fait j'y songe, as-tu pensé à regarder du côté des librairies (genre imagemagik par exemple) qui doivent à mon avis faire le filtrage de Canny ?

    A+

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Par défaut
    Ok, je vais essayé de voir.

    merci pour tes conseilles

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Par défaut
    Bon, je vais peut-etre passer pour un naze, mais je ne trouve pas les librairies.. j'ai installer le logiciel, mais j'ai pas de traitement d'image intégrer au logiciel, et sur le site sais pas très clair...

  13. #13
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Salut !

    Désolé pour le retard (encore...).

    Pour ce qui est des librairies, comme imagemagik, il faut que tu prennes les codes sources, pas les binaries... Ce lien te renvoie vers les codes sources je crois...

    Sinon pour le filtrage gaussien (ou autres, c'est un ensemble de classes C++ qui permettent de faire du filtrage récursif), je l'ai retrouvé... Je peux te l'envoyer par mail (donne moi ton adresse via mp)...

    Bien sûr je veux bien passer mon code à quiconque me le demande via mp...

    A+

Discussions similaires

  1. problème d'affichage des caractères spéciaux avec la console Dos
    Par javass dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 14/05/2008, 17h58
  2. Réponses: 4
    Dernier message: 15/04/2008, 18h24
  3. Problème pour faire des box extensibles avec des images)
    Par dream_of_australia dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 17/11/2007, 10h58
  4. Problème de suppression des relations de table
    Par mouche dans le forum Access
    Réponses: 2
    Dernier message: 10/05/2007, 13h50
  5. Réponses: 1
    Dernier message: 30/10/2005, 09h19

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