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 :

remplissage


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Par défaut remplissage
    J'aimerai savoir comment remplir une image bmp en noir et blanc, en ayant juste un contour d'une forme. Je voudrais remplir l'interieur de la forme.

    Exemple :

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    C'est plutôt une question à demander dans le forum algorithmique puisque si tu ne sais pas comment le faire, tu n'es pas encore au point pour l'implémenter en C.

    Avant même de répondre à un algorithme, est-ce que tu as résolu comment ouvrir une image bmp, comment savoir la couleur d'un pixel, comment modifier une couleur?

    Sans cela, ce n'est pas encore la peine de chercher un algorithme... Ensuite, il faut savoir si tu veux un algorithme rapide ou est-ce que l'algorithme naïf te suffirait...

    Si la figure est fermée, ceci peut marcher
    Pour une image IM
    Pour chaque colonne,
    Récupérer dans min la position inférieure de la figure (ie tel que IM[min] = noir et que pour tout 0<=i<min, M[ i ] soit blanc).
    Récupérer dans max la position supérieure de la figure (ie tel que IM[max] = noir et que pour tout max<i<Nbr de lignes de l'image, M[ i ] soit blanc).
    Colorier tous les pixels M [ i ] avec min < i < max en noir
    Jc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Par défaut
    On a deja reussi a optenir le contour de la forme, on veu juste remplir l'interieur de la forme. La methode ke tu as proposee ne fonctionne pas toujours, imagine si tu avai cette forme :


  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Exact, à ce moment il faut faire un peu plus de travail pour chercher l'intérieur...

    - Soit tu te débrouilles pour que pendant le parcours en colonne tu saches si tu ressors de la figure (en repassant sur un ou plusieurs pixels noirs) et lorsque tu reviens dedans (en repassant sur un ou plusieurs pixels noirs)

    Soit tu te débrouilles pour trouver un point qui est dans la figure et tu fais une version récursive/itérative avec pile qui colories tous les points autour et boucle tant qu'il existe un point qui n'a pas été colorié... Cela marche bien sûr si de n'importe quel point dans la figure, tu peux accéder à n'importe quel autre point dans la figure sans ressortir de la figure...

    Jc

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121

  6. #6
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    Cela me semble facile.
    Il suffit de calculer l'aire inluse via une relation du type
    0.5 * abs(somme (xdy-ydx) )
    et de voir si l'adjonction d'un point supplémentaire accroit ou décroit cette aire.
    J'ai déjà commenté sur toutes une série de posts ce sujet. Il a fait l'objet de nombreuses reflexions et je pense qu'1 solotion raisonnable peut y être trouvée.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Par défaut
    Merci je vais chercher une solution.

  8. #8
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Peut-etre qu'il suffit de créer un procedure de coloriage qui colorie un pixel si celui-ci n'est pas déjà colorié. La procedure de coloriage se rappelle récursivement dans toutes les directions (8 en tout). Cette procèdure doit être lancée la première fois sur un pixel quelconque intérieur à la forme. C'est une sorte de coloriage par "inondation".

    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
    procedure Colorier(pixel currentPix, Couleur c)
    debut
     
      si non estDejaColorie(currentPix) alors
             currentPix <- c; 
     
             Colorier(haut(currentPix), c);
             Colorier(bas(currentPix), c);
             Colorier(gauche(currentPix), c);
             Colorier(droite(currentPix), c);
             Colorier(diagHG(currentPix), c);
             Colorier(diagHD(currentPix), c);
             Colorier(diagBG(currentPix), c);
             Colorier(diagBD(currentPix), c);
     
      finsi;
     
    fin;
    PS : Cela doit marcher si la bordure de ta forme fais au moins 2 pixels d'épaisseur ce qui a l'air le cas d'après ton image.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  9. #9
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Oui, la méthode proposée par Hephaistos007 est un algo de remplissage classique. On peut aussi limiter à 4 appels récursifs (en supprimant les diagonales), le résultat sera identique (sauf cas particuliers).

    Pour des raisons de performances, faire tant d'appels récursifs n'est pas toujours une bonne idée, la pile prend cher.

    Je conseille de faire le parcours de manière itérative, en utilisant une pile ou une file.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    f.enfile(currentPix);
    tant que f n'est pas vide, faire :
      currentPix = f.défile();
      colorier(currentPix);
      f.enfile(haut(currentPix));
      f.enfile(bas(currentPix));
      f.enfile(gauche(currentPix));
      f.enfile(droite(currentPix));
    fin tant que
    En faisant bien sûr une vérification pour éviter les boucles infinies (le mieux est de mettre un booléen dans la matrice).

  10. #10
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Oui en effet, 4 directions suffisent. Je sais pas pourquoi j'ai dis 8

    Après il est vrai qu'avec une telle solution récursive, sur une grosse image, la pile de contexte va être à l'agonie Une version itérative est préférable, comme toujours...
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Des outils de morpho maths sont tout à fait adaptés à ce travail.

Discussions similaires

  1. Remplissage d'une zone d'un canvas
    Par ulysse66x dans le forum Composants VCL
    Réponses: 5
    Dernier message: 31/01/2004, 12h41
  2. [LG]Remplissage d'un tableau
    Par luno2545 dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2004, 21h47
  3. Réponses: 7
    Dernier message: 17/01/2004, 17h13
  4. Réponses: 13
    Dernier message: 14/10/2003, 14h31
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

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