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 :

Reconnaissance d'un cercle sur une image


Sujet :

Traitement d'images

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2011
    Messages : 26
    Points : 22
    Points
    22
    Par défaut Reconnaissance d'un cercle sur une image
    Salut à tous,

    S'il vous plaît j'aimerai extraire un cercle et tout son contenue d'une image mais je ne sais pas comment procéder dans matlab.
    Quelles fonctions dois-je utiliser ? J 'ai essayé de lire vos réponses par rapport aux reconnaissances de formes mais ce n'était pas dit simplement.

    Merci

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    la transformée de Hough pour les cercles est faite pour ça.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre averti 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
    Points : 404
    Points
    404
    Par défaut
    Sur Matlab, je ne sais pas mais dans la théorie, si le contour de ton cercle est suffisamment marqué et que tu n'as pas trop de bruit, tu peux trouver le centre de cercle de la façon suivante.

    Tu extrais les contours de ton image selon la méthode de Canny :
    1. petit flou gaussien pour lisser l'image
    2. extraction du gradient de l'image (Sobel)
    3. maxima locaux + seuillage par hysteresis pour obtenir les contours

    (Matlab doit probablement avoir une instruction qui fait tout ceci d'un coup.)

    En chaque point de contour, tu connais donc la direction du gradient. Ca te donne donc une droite pour chaque point du contour (point + vector). Ces droites, si les points appartiennent tous à un cercle, doivent toutes s'intersecter au même point, le centre du cercle.

    Concrètement, on utilise une image d'accumulation dont tous les pixels sont mis à 0. On parcourt chacune des droites (évoquées plus haut) en ajoutant 1 point à la valeur de chaque pixel parcouru dans l'image d'accumulation. On se retrouve à la fin de l'opération avec un maximum d'accumulations (ou de votes) dans l'image : c'est le centre du cercle.

    Si tu connais le rayon approximatif du cercle et si tu sais que l'intérieur du cercle est blanc et l'extérieur noir, tu peux limiter le parcourt de chaque droite rendant l'image d'accumulation plus claire.

    Ensuite il faut re-parcourir les droites en sens inverse, c-a-d du centre que tu viens d'identifier vers les pixels contours. Pour chaque droite tu vas trouver une distance moyenne du centre au pixel contour associé. Cette distance moyenne c'est le rayon du cercle.

    Flo.

  4. #4
    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 Flo. Voir le message
    En chaque point de contour, tu connais donc la direction du gradient. Ca te donne donc une droite pour chaque point du contour (point + vector). Ces droites, si les points appartiennent tous à un cercle, doivent toutes s'intersecter au même point, le centre du cercle.
    Je ne suis pas certain que ca soit très robuste comme méthode. Sur image réelle, les probabilités que les normales au contour passent toutes par le même point doivent être assez faible. Non ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre averti 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
    Points : 404
    Points
    404
    Par défaut
    A noter que ce principe n'est pas de mon propre cru mais du cru d'un gars qui l'exposait sur son site pour optimiser hough sur des cercles - je ne retrouve malheureusement plus son lien.

    Les centres de ces ellipses sur l'image plus bas (image de profondeur) ont été extraits par le principe que j'ai énoncé. Ces ellipses représentent un cercle vu en perspective. Une calibration du système permet de connaître le petit et grand diamètre de l'ellipse.

    Le principe que je cite plus haut est donc modifié pour être appliqué sur une ellipse. Il s'agit de calculer à l'avance le rayon pour chaque valeur angulaire du gradient (sachant que les ellipses ont toujours leur grand diamètre horizontal).

    Pour chaque point de contour dont le gradient a un angle théta, j'accumule le long d'un segment [R(theta)-precision; R(theta)+precision] à partir du point contour dans la direction du gradient. La constante précision est là pour compenser le fait (comme le souligne pseudocode) que toutes les lignes ne s'intersectent pas au même endroit.

    Cet "amas d'intersections" est en bleu dans l'image. Il ne s'agit effectivement pas d'un point. On peut récupérer un centre approximatif avec le centre de gravité de cet amas.

    Ensuite en remontant le long des gradients en partant du centre vers l'extérieur je trouve le contour des ellipses (en rouge). A partir de là je fais un truc un peu plus sioux qu'une moyenne des distances [pixel rouge; cenre de gravité de l'amas bleu] mais une telle moyenne sur des contours moins bruités pourrait faire l'affaire.



    A noter que cette solution fonctionne en milieu industriel avec un robot sans problème. Je n'ai malheureusement pas la carte d'accumulation associée et n'ai pas non plus le temps d'en refaire une.

    (ah au fait si toutes les ellipses ne sont pas détectées c'est que je traite uniquement certains niveaux de gris).

    Flo.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    outre le fait que la solution élégante et directe a été donnée plus haut,

    Citation Envoyé par Flo. Voir le message
    Sur Matlab, je ne sais pas mais dans la théorie, si le contour de ton cercle est suffisamment marqué et que tu n'as pas trop de bruit, tu peux trouver le centre de cercle de la façon suivante.
    une solution par moindres carrés nettement plus simple et sûre algorithmiquement parlant se trouve dans la rubrique Contribuez sous le titre "Ellipse-fitting"...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre averti 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
    Points : 404
    Points
    404
    Par défaut
    outre le fait que la solution élégante et directe a été donnée plus haut,
    Je loue les solutions élégantes (et encore quand elles sont à bas prix !). Mais bien souvent si la théorie donne une idée très attrayante de la résolution d'un problème, la pratique a tôt fait d'y intégrer des astuces pour soumettre la solution théorique à des contraintes de temps, d'espace mémoire, et blabla.

    Quand aux moindres carrés, c'est effectivement ce que j'utilise une fois ma remontée des rayons opérés pour extraire le rayon et centre définitifs.

    Enfin bon bref, ma méthode fonctionne et est éprouvée à raison d'un traitement (300 ms) par seconde depuis 3 ans maintenant. Le traitement en question permet à robot 6 axes d'aller décaisser les cylindres dont sont issus les ellipses et ceci en 3D (image de profondeur) le tout avec une précision de 0.6mm. Au dessus du millimètre le robot explose le cylindre. Et croyez-moi le client y tient à ses cylindres.

    Après si ça vous amuse de ressortir les noms de quelques chapitres de quelques bouquins de traitements d'image ou de jeter ça et là le nom des fonctions OpenCV qui vont bien, je ne suis pas sur que ça aide franchement le posteur.

    L'image que j'ai postée est suffisamment claire pour m'éviter de telles remarques !

    Flo. (légèrement énervé sur le coup j'avoue !!!)

  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 Flo. Voir le message
    A noter que cette solution fonctionne en milieu industriel avec un robot sans problème. Je n'ai malheureusement pas la carte d'accumulation associée et n'ai pas non plus le temps d'en refaire une.

    (ah au fait si toutes les ellipses ne sont pas détectées c'est que je traite uniquement certains niveaux de gris).

    Flo.
    Ah, je comprend mieux pourquoi ca marche si bien dans ton cas. Tes images sont très "propres", avec des contours biens réguliers et sans chevauchements.

    Pour ma part, ca serait certainement moins probant.

    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    et dans mon cas encore pire, car encore plus bruitées :

    Images de galaxies elliptiques
    Images attachées Images attachées  
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Dessiner un cercle sur une image
    Par 7ider5 dans le forum Débuter
    Réponses: 4
    Dernier message: 26/04/2011, 05h07
  2. Détecter les cercles sur une image
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 10/09/2010, 08h47
  3. un cercle sur une image
    Par alexismarque dans le forum Tkinter
    Réponses: 5
    Dernier message: 10/05/2010, 15h06
  4. dessiner des cercles sur une image avec java
    Par inès83 dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 04/05/2008, 17h34

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