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 :

Algo de "remplissage de trous"


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 10
    Points
    10
    Par défaut Algo de "remplissage de trous"
    bonjour à tous,

    je cherche à faire un système de remplissage de trou dans une image en noir et blanc.
    le but est que toutes les zones noires entourées de blanc deviennent blanches (logique non? )

    j'avais pensé un moment faire une segmentation et blanchir les zones noires étant trop petites mais ca ne reponds pas à la problematique, et en plus c'est un peu bourrin.

    Au niveau des opérations d'ouvertures et de fermetures, ca ne convient pas car les "trous" ne sont pas tjs assez petits

    La solution qui me parait etre la plus adaptée consiste en une recherche de contours fermés, mais le coté récursif de ces methodes pose probleme car le pc ne peut gerer plus d'un certain nombre d'appels récursifs...

    je voulais donc savoir si qqun a une autre idée ou connait un algo de recherche de contour fermé non recursif ou limitant les appels recursifs.

    merci par avance.

  2. #2
    Membre confirmé
    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
    Points : 451
    Points
    451
    Par défaut
    Salut!

    Quelle est la forme de tes "trous" ?
    S'ils sont elliptiques tu peux chercher du côté de la transformée de Hough...

    Sinon tu es sûr que les opérations de fermeture ne marchent pas ? On parle bien des opérateurs morphologiques ?
    Tu as pris une forme de référence correcte (je parle de la forme qui sert de référence dans les opérations morphologiques) ?
    La taille de tes trous est variable ?

    A+
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 10
    Points
    10
    Par défaut
    ben en fait les trous sont de tailles variables et sans forme particuliere...

    du coup les operation morphologiques (erosion, dilatation) ne marchent pas pour tous les trous...

    c'est pour ca que je cherche un algo un peu plus poussé.

    sinon je ne vois pas trop de quoi tu parles à propos de la forme de référence des opérateurs morphologiques. pour moi lors de la dilatation, on étend ts les contours de 1pix puis on fait l'operation inverse... je ne vois pas trop où intervient une forme de référence...

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Tu peux regarder de ce côté:
    http://www.developpez.net/forums/vie...253&highlight=

    Si je résume:
    - Tu as ton image img
    - tu en crées une copie img2
    - tu prends un pixel du bord de img2 noir et tu remplaces récursivement (en cherchant les voisins noirs dans un 4-voisinage)) les points noirs par des points blancs (cf le lien que je t'ai donné) => ca va colorier tout sauf les trous
    [Edit]: en fait ton point peut se trouver dans une "enclave" => tu ne parcoureras pas toute l'image. Comme cela se fait avec une structure de pile, il faut initialiser ta pile avec tous les points blancs du bord de ton image et la tu es tranquille. [/Edit]
    - tu fais img = img xor img2 => tu as en noirs ce qu'y était en blanc + les trous
    - img = not img => tu as ton images avec les trous bouchés
    (avec un dessin, on comprend mieux l'algorithme)
    J'ai sûrement pas été clair mais mon implémentation en python marche parfaitement (20 lignes)

  5. #5
    Membre confirmé
    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
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par Cpt.Spiff
    sinon je ne vois pas trop de quoi tu parles à propos de la forme de référence des opérateurs morphologiques. pour moi lors de la dilatation, on étend ts les contours de 1pix puis on fait l'operation inverse... je ne vois pas trop où intervient une forme de référence...
    Dans les opérations de morphologie mathématique on choisit une forme de référence à partir de laquelle on fait les opérations. Quand tu étends tous les contours de 1 pixels à tu utilises certainement une forme de référence style un carré de 4 pixels.
    Mais tu peux choisir par exemple une direction privilégiée d'extension comme une forme composée de 2 pixels horizontaux --> tu étends de façon privilégiée selon les x...
    Tu peux avoir des formes de référence style cercles, triangles, ... ça varie à l'infini...
    Mais bon ça c'était pour la culture G , Guigui_ t'a donné une méthode qui a l'air vraiment pas mal...

    A+
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 10
    Points
    10
    Par défaut
    je vois..
    merci pour la precision mathieu.

    pour ce qui est de l'algo recursif, je vais me pencher dessus mais j'espere qu'il n'engendre pas trop d'appel...

    je vous tiens au courant

    +

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 10
    Points
    10
    Par défaut
    je vois..
    merci pour la precision mathieu.

    pour ce qui est de l'algo recursif, je vais me pencher dessus mais j'espere qu'il n'engendre pas trop d'appel...

    par contre dans ta methode tu supposes que tu as un bord noir continu tout autour de l'image non??

    pq si j'ai bien suivi:
    - tu initialise l'algo en partant sur un point noir (dasn le fond de l'image)
    - recursivement dans un buffer tu mets à blanc tt les pixels noirs connexes du pixel de depart
    - ensuite tu fais un xor et un not pour obtenir l'image avec les trous bouchés.

    --> si y'a le motif blanc qui coupe l'image ca ne marche plus... rque à ce moment ca devient difficile de savoir ce qui correspond à un trou ou non... je vais essayer de travailler mes images un peu plus pour me mettre dans un cas plus propice. en tt cas ton algo est sympa

    je vous tiens au courant

    +

  8. #8
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par Cpt.Spiff
    pour ce qui est de l'algo recursif, je vais me pencher dessus mais j'espere qu'il n'engendre pas trop d'appel...
    En fait le remplissage ne se fait pas avec une fonction récursive. Cela se fait avec un while
    cela ressemble à ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pile=[] (liste vide)
    Initialisation de la pile avec les points noirs du bords et je colorie en blanc les points ajoutés
    tant que la pile n'est pas vide:
    DEBUT
        je dépile un élément
        Pour chacun de ses voisins noirs:
               j'ajoute le voisin dans la pile et je le colorie en blanc
    FIN

  9. #9
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par Cpt.Spiff
    par contre dans ta methode tu supposes que tu as un bord noir continu tout autour de l'image non??
    nan ton bord peut être quelconque, tu ne rajoutes que les points noirs dans la pile de départ
    Par contre, je te conseille ensuite d'ajouter une bordure de points blancs tout autour de ton image pour que lorsque tu recherche les voisins tu n'es pas besoin de te soucier si tu tombes en dehors de ton image.

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Points : 10
    Points
    10
    Par défaut
    ce que je veux dire c'est qu'il me semblait que l'algo etait cantonné à la zone à laquelle appartient le pixel d'initialisation...

    et de toute facon, sauf si j'ai bien compris, ca pose (dans mon cas) un gros probleme d'automatisation, puisque je ne sais pas à l'avance où se situe les trous, donc pour placer les pixels de départ c'est chaud...

    quoique d'apres ta reponse, y'a un truc que j'ai pas saisi ds l'algo...

  11. #11
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par Cpt.Spiff
    ce que je veux dire c'est qu'il me semblait que l'algo etait cantonné à la zone à laquelle appartient le pixel d'initialisation...
    c'est pour ça qu'on initialise avec tous les pixels noirs du bord de l'image
    Citation Envoyé par Cpt.Spiff
    et de toute facon, sauf si j'ai bien compris, ca pose (dans mon cas) un gros probleme d'automatisation, puisque je ne sais pas à l'avance où se situe les trous, donc pour placer les pixels de départ c'est chaud...
    l'algo n'a pas besoin de savoir où sont les trous parce qu'il remplit en fait tout ce qui n'est pas un trou, et par définition ce qui n'est pas un trou doit avoir un point qui touche le bord.
    Ensuite avec le xor et le not, on récupère les trous.

Discussions similaires

  1. remplissage des trous d'une image.
    Par benyasla dans le forum Traitement d'images
    Réponses: 25
    Dernier message: 05/04/2006, 11h59

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