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 :

Approximation de contour


Sujet :

Traitement d'images

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut Approximation de contour
    Bonjour,

    je dispose d'images BMP de motif (un motif par image).

    Nom : 315056 _contour.jpeg
Affichages : 361
Taille : 11,6 Ko

    J'utilise OpenCv pour détecter le contour de ce motif. J'obtiens donc la liste des pixels constituant ce contour.
    J'aimerais ensuite réduire cette liste de points en ne conservant que les points d'inflexion tels que dessiner en rouge sur l'image jointe.

    Nom : 315056_ptInflexion.jpeg
Affichages : 337
Taille : 14,2 Ko

    J'ai essayé l'algo de Douglas-Peucker avec la fonction "ApproxPolyDP" d'OpenCV, aussi réalisé ma propre implémentation de cet algo et tenté des approches itératives (dépendant de la distance et de l'angle)
    Aucune de ces tentatives ne m'a permis d'obtenir le résultat escompté...
    Avez-vous svp une idée de la manière de s'y prendre pour récupérer les points d'inflexion comme sur l'image jointe ?
    Je parcours depuis plusieurs jours des papiers sur l'approximation polygonale sans trouver mon bonheur...
    Par avance merci pour votre aide !
    Jc

  2. #2
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    Les points rouges ne sont pas des points d'inflexion au sens mathématique.
    Comme souvent, la première question est : que cherche-t-on exactement. Cà permet d'avancer vers la solution.
    Suggestion : la figure semble constituée de segments et d'arcs de cercle. Cherches-tu les raccordements ? (il y a alors des points en trop)
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Bonjour et merci pour votre intérêt !
    Effectivement, le terme n'était pas le bon, je connaissais pas le terme de raccordement (point de raccord en fait)
    Je cherche à obtenir les points de raccord entre segments, entre segments et courbes, et entre arcs de cercle lorsque les courbes présentent un angle supérieur à 90°.
    Auriez-vous une idée, un nom d'algo ou une piste de dev pour résoudre une telle problématique.
    Merci !

  4. #4
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    Ce que j'essaierais, pour commencer.
    - Trouver un pixel blanc ayant un voisin noir
    - Parmi les huit voisins de ce pixel, il doit y en avoir deux ayant un voisin noir, en sélectionner un
    - Parmi les huit voisins de ce pixel, il doit y en avoir deux ayant un voisin noir, sélectionner celui où on n'est pas passé.
    - Recommencer jusqu'à revenir au point de départ
    On a maintenant la liste des pixels du contour.
    Pour chacun de ces pixels :
    - Sélectionner celui n positions après
    -calculer l'angle du segment défini avec l'horizontale
    En traçant cet angle en fonction du pixel, les lignes droites du contour correspondent à des plateaux, les arcs de cercle à des montées ou des descentes. Les bords des plateaux sont des points de raccordement.
    On verra plus tard si pour les raccords entre les arcs.
    On suppose que les éléments du contour ont une taille minimale. n doit être sensiblement plus petit.
    Bon courage
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Un fonction OpenCV (FindContour) retourne la liste des pixels ordonnés constituant le contour.

    Ensuite, j'ai déroulé à la main ton algo sur un dessin et cela ne fonctionne pas, même avec n très petit.
    Effectivement, l'angle avec l'horizontal va évoluer avant d'avoir atteint le point de raccord,
    les plateaux sur le tracé de la fonction d'angles ne correspondent pas exactement aux segments de mon contour
    et donc les limites des plateaux ne donneront pas les points de raccord...

  6. #6
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    J'avais oublié que tu avais déjà le contour ...
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Aprés tatonnement, j'ai écrit ce code qui a l'air de pas mal fonctionné.
    Il est basé sur un critère de distance des points intermédiaires par rapport aux edges successifs.
    C'est en C#...

    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
    List<Point> returnPoints = new List<Point>();
    returnPoints.Add(contour[0]);
    int iLastPt = 0;
    for (int iCurseur = 1; iCurseur < contour.Size; iCurseur++)
    {
        Point currentPt = contour[iCurseur];
     
        int iCheck = iCurseur - 1; 
        while ( iCheck > iLastPt)
        {
              Point lastPt = returnPoints[returnPoints.Count - 1];
              Point checkPt = contour[iCheck];
              PointF closest = PointF.Empty;
     
              double dist = FindDistanceToSegment(checkPt, lastPt, currentPt, out closest);
     
              if (Math.Abs(dist) > 3)
              {
                     returnPoints.Add(checkPt);
                     iLastPt = iCheck;
                     continue;
              }
              iCheck--;
        }
    }
    Ca donne ce résultat pour le motif pris en exemple dans ce post :

    Nom : 315056 _keypoints.jpeg
Affichages : 287
Taille : 20,4 Ko

    Toute autre idée est la bienvenue pour améliorer cet algo !!!
    Merci

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Je rebondis sur la question: si on a la liste des points qui forment le contour, est ce que du coup, il est possible d'inventer un algorithm qui soit l'inverse de bresenham ?

  9. #9
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    @jcloupgarou
    Si tu peux donner la liste des points du contour, ce sera plus facile.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    si vous avez la liste des points du contour cela va grandement vous faciliter la tache

    imagine que vous parcourez la liste
    vous comparez n avec n-1 cela vous donne une direction.
    Tans que la direction ne change pas vous n'enregistre pas les points intermédiaire.
    vous pouvez pour commencer avoir huit directions : 2 verticale ,2 horizontale et 4 diagonale

    une fois élagué les point ne servant a rien tu peut affiner avec des combinaison de points genre \_/ il y a de grande chance que cela soit un cercle
    donc a toi de peaufiner

    Ps : un variante serais de faire la somme des huit pixel autour si la somme ne change pas cela veut dire que la direction ne change pas
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #11
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Moyennement d'accord avec le message d'Anapurna.

    Si on a un segment qui va de (5,5) à (20,30) , ça va se traduire au niveau pixel par plein de tout petits segments, alternativement verticaux et en diagonale. Mais le besoin, c'est de les synthétiser en un seul segment.

    Il faut prendre du recul. Je prends un pixel, je prends 15, voire 20 pixels plus loin. Je calcule le segment qui relie ces 2 points. En arrondissant systématiquement aux entiers les plus proches. Et si la succession de points obtenus coïncide avec les points de notre tableau, alors on peut remplacer les 15 ou 20 points en question par un segment.

    Identifier des segments de droite, ça se fait à peu près bien. J'imagine même qu'il existe des librairies qui font ça, parce que c'est un besoin relativement courant.
    Par contre, j'ai cru comprendre que l'objectif était de décomposer le contour en une succession de segments, et/ou d'arcs de cercle. Et identifier des arcs de cercle, ça me paraît un peu plus compliqué.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    La réflexion de tbc92 est tout à fait pertinente
    Effectivement, le contour est une suite de pixels voisins. Les directions entre chaque pixel suivent soit l'horizontale, soit la verticale, soit une diagonale.
    L'algo que j'ai proposé permet de retenir les différents points de raccord (avec plus ou moins de pertinence) à partir d'un critère de distance similaire à celui utilisé dans l'algo de réduction de Douglas-Peucker.
    Par contre, ce critère en nombre de pixels n'est pas vraiment adapté pour maitriser l'angle d'ouverture des arcs de cercle.
    J'ai mis en pièce jointe un fichier contenant tous les points du contour que j'ai pris en exemple dans ce post.
    Merci pour votre aide !
    Fichiers attachés Fichiers attachés

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Tout dépend du niveau de précision que tu recherche pour "vectoriser" le contour. C'est à dire définir les segments et arcs de cercle.

    Dans ton exemple tu as un dessin, sans anti-aliasing. Les segments et arcs de cercle sont normalement produit par l'algorithme de Bresenham (qui fait aussi les coniques).

    Pour rappel, sur un segment de x1, y1 à x2 ,y2 ont dessine les pixels x,y tel que x1, y1 à x,y minimise l'erreur. C'est à dire avec une pente plus proche de la pente souhaitée.

    Pour retrouver un segment dans ton contour peut être que tu peux parcourir des pixels voisins et vérifier qu'à chaque pas on tend vers une pente "idéale".
    En faite à chaque pas les bornes qui définissent l'ensemble des pentes possible convergent.

    Je t'invite à revoir l'algorithme de bresenham.

    Bon courage.

    PS: une autre approche avec un changement de repère selon l'algorithme de Hough et peut être intéressant aussi.

  14. #14
    Membre régulier
    Avatar de Alex64
    Homme Profil pro
    Senior . Formation : topographe
    Inscrit en
    Août 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Senior . Formation : topographe
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2014
    Messages : 58
    Points : 112
    Points
    112
    Billets dans le blog
    1
    Par défaut comment interpreter une polyligne ?
    si je comprend bien l'algo. de Bresenham ou de Hough génère une polyligne.
    Une fois la poly ligne crée il faut l'interpréter (ex: est-ce un point du début ou fin une droite? un point d'une courbe ?)

    A mon avis il faut ,en plus de ses coordonnées, attribuer un paramètre a chaque points de la polyligne (lors du traitement algorithmique).
    Comme les données d'une table a digitaliser.

    exemple

    si c'est un point d'une droite ou le début d'une courbe l'attribut = "C"
    X Y attribut
    10,22 20,32 C ou C 10.22 20.32

    si c'est un pt. d'arc de courbe attribut= "A"
    X Y attribut
    52,35 30,20 A ou A 52.35 30.20

    cas pour la fin d'une courbe

    si attribut (n-1) = "A" et attribut (n+1) = "C" alors attribut (n) = "C"

    mais est-ce possible ?????
    "le bonheur est la seule chose que l'on peut donner sans l'avoir" (Txiki)

  15. #15
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 330
    Points : 4 151
    Points
    4 151
    Par défaut Algo de madame Irma
    Bonjour,

    Je tenterais ceci :
    • En exprimant les points sur forme x(t), y(t) par des polynômes d'ordre donné, je prédis la position suivante à partir des derniers points (nombre plus ou moins important selon l'ordre polynomial choisi).
    • Si la prédiction est bonne (dans le demi-point environnant) on n'enregistre pas le point prédit mais on l'intègre dans la prévision suivante.
    • Si la prédiction est mauvaise, on enregistre le dernier point OK et on recalcule les coefficients des polynômes à partir des points actuels.


    Ce n'est pas idéal mais cela devrait diminuer sensiblement le nombre de points (d'autant plus que l'ordre des polynômes est élevé sans exagérer).

    L'ordre 1 reprend une projection de Bresenham et donc tente de réduire la courbe à des segments de droites.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. Approximer un contour par une spline
    Par cjacquel dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/03/2017, 20h50
  2. Détection de contours et approximation
    Par picsou42 dans le forum Traitement d'images
    Réponses: 27
    Dernier message: 05/08/2009, 11h57
  3. [Flash Mx] Problème de contour texte
    Par tahiti bob dans le forum Flash
    Réponses: 13
    Dernier message: 12/03/2004, 13h52
  4. Lissage de contours
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 12/02/2004, 12h40
  5. [Kylix] contour visible d'un TextRect?
    Par skoupay dans le forum EDI
    Réponses: 1
    Dernier message: 12/03/2003, 12h00

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