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 :

code pour une fonction qui récupère les pixels de contour d'un objet au sens horaire


Sujet :

Traitement d'images

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 9
    Points
    9
    Par défaut code pour une fonction qui récupère les pixels de contour d'un objet au sens horaire
    Salut
    Je souhaite obtenir les pixels de contours d'un objet dans une image étiquetée, dans l'ordre suivant un des deux sens (horraire ou trigo).
    -Mon image a la forme suivante par exemple :

    0 0 0 0 0 0 0 0
    0 1 1 1 1 1 1 0
    0 1 0 0 0 0 1 0
    0 1 0 0 0 0 1 0
    0 1 1 1 1 1 1 0
    0 0 0 0 0 0 0 0

    1-J'ai commencé par deux for afin de balayer l'image
    2-Je détecte le premier pixel qui appartient à l'objet.
    3-je fais un balyage recursif pour ses voisins de la manière suivant:
    ***
    *1*
    ***
    4-je detecte le voisin qui appartient à l'objet et je continue comme ça.

    Le problème c'est ce que j'arrive pas à arrêter la procédure !!!!

    Je cherche un code idéal pour ce problème ...

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Tu peux marquer les pixels que tu as déjà parcouru.

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    je les ai déjà marké mais le problème c'est quand je traite le pixel qui est au coin en bas droite, je peux pas continuer !

  4. #4
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    373
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 373
    Points : 512
    Points
    512
    Par défaut petite suggestion
    tu peux résoudre ton probleme de bords de 3 maniéres.
    soit tu crée un espace de stockage de tes pixels qui soit 2 lignes et deux colonnes plus grands que l'original, auquel cas ces lignes seront systématiquement remplies avec des 0 et tu n'auras pas à gérer l'effet de bord. de plus ca ne te bloquera plus..
    inconvenient, ca fait plus de bytes.. mais bon..
    ca élimine toutes les vérifications et les accés necessaires.

    deuxieme possibilités, tu vérifies sytématiquement via une fonction genre
    pixelpossible(x,y) que le pixel que tu veux tester à coté est testable..
    ca t'évitera les débordements.


    ou alors tu inclues directement le code de vérification avant le test dans ta boucle de parcours.. un peu caca, mais ca marche aussi.

  5. #5
    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,

    pour faire ce genre de parcours récursif, il faut au préalable donner des priorités de directions (par exemple haut, gauche, bas, droite) et surtour marquer les pixels déjà parcourus.
    Tu essaies donc toujours de commencer par aller en haut, si c'est impossible (pas de pixels plein au dessus, ou pixel n'appartenant pas au bord ou pixel déjà visité), tu essaies d'aller à gauche, ...

    Une autre solution peut être plus facile mais moins élégante, c'est de faire comme dans la première étape de la marche de Graham (pour trouver l'enveloppe convexe) :
    - tu sélectionnes tous les points du contours.
    - tu trouves le barycentre B et le point P le plus en haut à droite.
    - tu tries les points "p" en fonction de l'angle PBp.
    La complexité est en O(N Log N), qui est la complexité du trie par comparaison (QuickSort ou tri par tas) car les deux premières opérations sont en O(N).

    Petite correction (Merci PseudoCode), la deuxième version que j'ai donné marche pour des formes convexes ou étoilées, mais par pour des formes fortement non convexes.
    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.

  6. #6
    screetch
    Invité(e)
    Par défaut
    je n'ai pas compris si tu cherchais a avoir le contour ou si tu avais le contour et voulait lister tous les points ?

    voila une liste d'etapes a effectuer :

    ton image de depart, c'est

    0 0 0 0 0 0 0 0 0 0
    0 1 1 1 1 0 0 0 0 0
    0 1 1 1 1 1 1 1 1 0
    0 1 1 1 1 1 1 1 1 0
    0 0 0 0 0 1 1 1 1 0
    0 0 0 0 0 0 0 0 0 0

    (exemple hein)

    pour obtenir le contour,tu peux realiser une "erosion" de cet objet par le pattern suivant :
    0 1 0
    1 1 1
    0 1 0

    cela signifie que tu vas "creuser" autout de l'objet. je dirai plus tard ce qu'est une erosion. l'image resultante sera :

    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 1 1 1 0 0 0 0 0
    0 0 0 0 0 1 1 1 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0

    ensuite tu peux soustraire l'image 2 de l'image 1, tu obtiendras :

    0 0 0 0 0 0 0 0 0 0
    0 1 1 1 1 0 0 0 0 0
    0 1 0 0 0 1 1 1 1 0
    0 1 1 1 1 0 0 0 1 0
    0 0 0 0 0 1 1 1 1 0
    0 0 0 0 0 0 0 0 0 0

    tu vois que tu as pu obtenir le contour de l'objet en retirant l'interieur.

    ensuite si tu souhaites obtenir l'interieur, part du premier point que tu trouves (donc ici le point de coordonnees 1,1)
    et applique l'algo suivant :
    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
     
    construireContour(first)
    {
      Point next = first
      repeat
      {
        liste <- [next]
        dejavu <- [next]
        si (point au dessus de next fait partie du contour et pas encore vu)
          next <- point au dessus de next
        sinon si point au dessus a droite de next  fait partie du contour et pas encore vu)
          next <- ce point
        sinon si ... (parcours les points autour de next dans le sens des aiguilles d'une montre)
        sinon si point au dessus a gauche de next  fait partie du contour et pas encore vu)
          next <- ce point
        sinon c'est une ile de 1 point
      } tant que (next != first)
    j'ai ete volontairement vite car je ne suis pas sur d'avoir cerné ton probleme.

  7. #7
    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,

    il y a plus simple qu'une érosion pour obtenir le contour.
    Il suffit de vérifier pour chaque pixel plein de régarder s'il a au moins un voisin vide.
    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.

  8. #8
    screetch
    Invité(e)
    Par défaut
    je ne sais pas si il faut obtenir le contour ou bien lister les points du contour d'un objet, l'algorithme que je presente n'a pas besoin de travailler sur une image qui represente uniquement le contour (ca peut etre l'objet entier).

    pour l'erosion, je ne vois pas la difference entre faire l'erosion et la soustraction en une passe et ta methode, c'est la meme chose. j'ai mis des noms sur une methode, a priori, rien de plus.

  9. #9
    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,

    Citation Envoyé par screetch Voir le message
    pour l'erosion, je ne vois pas la difference entre faire l'erosion et la soustraction en une passe et ta methode, c'est la meme chose. j'ai mis des noms sur une methode, a priori, rien de plus.
    Pour l'érosion tu dois regarder tout l'élement structurant, soit un huit voisinage, dans la mienne tu t'intéresses directement aux pixels souhaités, mais la différence n'est pas énorme.
    Ce qui change surtout c'est de ne pas avoir à faire la soustraction.
    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.

  10. #10
    screetch
    Invité(e)
    Par défaut
    oui je vois ce que tu veux dire. mais je prefere souvent implementer des operations avec des operateurs standards au lieu de coder un nouveau balayage de l'image.

  11. #11
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Points : 50
    Points
    50
    Par défaut
    peut-être le codage de freeman pourra vous aider ?

  12. #12
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Merci bien à tous
    Je vous remercie

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/01/2008, 12h04
  2. Réponses: 4
    Dernier message: 04/05/2007, 22h49
  3. [MySQL] Créer une fonction qui récupère un enregistrement
    Par azahord dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/11/2006, 20h13
  4. Réponses: 15
    Dernier message: 26/03/2006, 12h10
  5. [Tableaux] demande de code pour une fonction.php
    Par carmen256 dans le forum Langage
    Réponses: 4
    Dernier message: 21/01/2006, 17h22

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