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 :

remplissage des trous d'une image.


Sujet :

Traitement d'images

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut remplissage des trous d'une image.
    bonjour
    je devrais faire un algorithme de remplissage des trous de mes images du cerveau. s'il vous plait de l'aide. et encore mieux si quelqu'un connait le code en matlab. j'apprends a utiliser matlab, et c'est pas évident.
    merci

  2. #2
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Quels trous ?

  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
    Salut,

    Mettons que ton cerveau soit en blanc sur un fond noir et que tes trous soient également en noir.

    Pour remplir les trous dans une image, tu pars d'un pixel du fond de l'image. En général on s'arrange pour que l'objet d'intérêt (l'image du cerveau dans ton cas) soit au centre de l'image. Ce qui fait que le pixel(x=0; y=0) devrait appartenir au fond.

    Donc tu pars de ce pixel noir. Tu le peints en blanc. Tu regardes ses voisins. Si un voisin est en noir tu le mets dans une liste de voisins à analyser puis tu le peints en blanc. Une fois que tu as vu tous les voisins autour du pixel(0,0), tu prends le premier pixel inséré dans ta liste. Tu regardes ses voisins : s'ils sont noirs tu les ajoutes dans la liste et tu les peints en blanc. Une fois fini, tu prends le 2eme pixel de ta liste, etc, etc.

    C'est un algo de croissance de régions. Tous les pixels de ton fond (si tu as un fond en "1 élément") vont se peindre en blanc. Au final seuls les trous restent en noirs.

    Il te suffit de faire l'inversion du ou exclusif entre l'image original et l'image ou le fond est blanc pour boucher les trous et te retrouver avec ton cerveau et les trous en blanc et le fond en noir.

    Voila.

    A+

    FLo.

  4. #4
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par Miles
    Quels trous ?
    Les trous de mémoire?

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut remplissage des trous d'une image.
    bonjour flo
    merci beaucoups pour ton aide !! c'etait tres bien expliqué !!
    justement, j'ai déja fait un seuillage de mon image !! et mon cerveau se trouve presqu'au milieu de ma fenetre.
    sinon cet algorithme m'a l'air compliqué a faire ?? c''est vrai, ou je me trompe.
    merci

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    par hazard, c'est pas plus simple si je fais une dilataion puis érosion? ou on a un meilleur résultat avec la methode de croissance de région.
    merci

  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
    Pas du tout, une bonne compréhension du principe et de l'organisation et hop c'est parti.

    Pour commencer, tu entoures ton image d'un cadre blanc, c'est à dire que tu mets tout les pixels du bord de l'image en blanc. Cela t'évitera de faire un test sur les coordonnées de l'image pour savoir si tu sors de l'image ou pas. Effectivement quand tu regarderas un voisin "bord de l'image", comme il sera en blanc, tu ne l'insèreras pas dans la liste et du coup t'iras pas regarder ses voisins (notamment ceux qui sont en dehors de l'image).

    C'est une astuce que j'ai apprise sur ce forum même .

    Donc le bord de l'image en blanc.

    Du coup le pixel de départ n'est pas pixel(0,0) (qui est en blanc ) mais pixel(1,1) qui normalement est noir.

    La suite dépend du format de ton image telle que tu la manipules, un tableau en 1 dimension, en 2 dimensions, via des accesseurs pour les pixels.

    Mettons que ton image est contenue dans un tableau à 1 dimension.

    Il te faut une liste qui mémorisera les index des voisins :

    A titre d'exemple pour les index, l'index du pixel(1,1) = 1 * largeur + 1

    Voici le pseudo-code de l'algorithme (désolé je suis pas habitué à ce type d'exercice):

    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
    Tu mets le bord de l'image en blanc
     
    Pixel(1, 1) = blanc
     
    Tu insères dans la liste (initialement vide) son index = 1 * largeur + 1
     
    Tant que la liste n'est pas vide :
     
            tu récupères le 1er index de la liste
     
            Pour chacun de ses 8 voisins :
     
                    Si le voisin est blanc :
                            tu ne fais rien
                    Sinon :
                            tu le mets en blanc
                            tu insères son index dans la liste
                    Fin Si
     
            Fin Pour
     
            tu supprimes le 1er index de la liste
     
    Fin Tant
    Ensuite tu fais un OU EXCLUSIF entre l'image ainsi obtenue et l'image original. Comme seul le fond de l'image diffère d'une image à l'autre, tu obtiendras ton fond en blanc et ton cerveau et les trous en noir.

    Ensuite tu fais une inversion d'image pour obtenir ton cerveau en blanc (sans trous) et ton fond en noir.

    Voilà.

    A+

    Flo.

  8. #8
    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
    L'inconvénient d'une fermeture de trous (dilatation / erosion), c'est que si tu ne connais pas d'avance la taille de tes trous, tu ne pourras jamais fermer tous les trous.

    Et si tu veux fermer tous les trous de façon sure ... avec une grosse dilatation suivie d'une grosse érosion, tu vas déformer ton image.

    Donc, si tous tes trous sont petits et qu'ils seront toujours petits tu peux faire une fermeture ... mais c'est moins propre à mon sens.

    En général une fermeture est faite sur une image dont on ne se soucit pas de garder les détails. Pour localiser un objet dans sa totalité, pour compter les objets (et recoller les éventuels fragments), etc) ... et dont on connaît les et nature des trous (bruit de binarisation, etc). C'est du général bien sur.

    Si les détails de l'objet sont importants il vaut mieux boucher les trous pour ne pas toucher à ces détails.

    Si tu as l'avantage d'avoir un fond uni (en 1 seule partie), il vaut mieux boucher les trous ... et en plus les trous seront bouchés indépendamment de leur taille.

    A toi de voir.

    Flo.

  9. #9
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    LA croissance de région peut se faire par érosion et dilatation. Fais un peu de recherche sur la morphologie mathématique, ça t'aidera - un bouquin de base expose la croissance de région.

  10. #10
    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
    LA croissance de région peut se faire par érosion et dilatation
    T'es sur de ça ?

    Les opérations d'érosions et de dilatations ne sont pas (du moins c'est ce qu'il me semble) propagatrices d'informations en dehors du cadre local d'un voisinage.

    Autrement dit, comment 2 pixels d'un même objet, suffisamment éloignés pour ne pas appartenir à un même voisinage, pourraient-ils se "connaître" dans le cadre d'érosions ou de dilatations ?

    Par contre elles détruisent irréversiblement de l'information ce qui va à l'encontre de l'algo de croissance qui ajoute de l'information (étiquettage de l'image) sans modifier l'information initiale.

    La croissance de région peut se faire de manière linéaire (temps de calcul constant à taille d'image donnée et indépendant du contenu de l'image) en 2 passes d'images avec une phase de recollement des étiquettes entre les 2 (Est-ce de ça dont tu parles ?).

    Elle peut également se faire telle que je l'ai décrite : l'objet est trouvé dans son entier en seule passe (mais en temps de calcul variable à taille d'image donnée et dépendant de la nature de l'objet).

    Outre ses 2 méthodes, je ne vois pas comment cela peut se faire différemment. D'un autre côté je suis loin de prétendre tout savoir .

    Peux-tu nous donner plus d'explication sur ta méthode, stp ? Sur le web, j'ai jamais vu ça

    Flo.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    milles merci, je ferai donc la methode de croissance de régions, je vous fais entierement confiance !!
    bonne journée, la mienne a tres bien commencé !!
    merci

  12. #12
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    oui, mais en plusieurs itérations - il y a aussi 2-3 autres petites opérations à faire, genre retirer l'extérieur à chaque fois -. Du moins je crois. Faudraitq ue je recherche le livre dans lequel c'était indiqué

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    je commencerai a utiliser le code que m'a donné flo. mon responsable de stage est d'accord aussi pour cette méthode, a ce qu'il parait ça donne un meilleur résultat que la fermeture, surtout que parfois les trous sont assez grand.
    déja, je vais commencer a penser comment avoir que mon contour de l'image !!

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    bonsoir
    je voudrai encore vous demander, quelle méthode vous me conseiller pour avoir le contour ? gradient, laplacien?
    au fait apres avoir seuillé, j'ai des tache blanches dans mon fond noir (du bruit). je pense qu'il fudrait que je l'enléve avant de commencer a faire la croissance de region. et donc aussi, qu'est ce que vous me conseillez comme méthode pour éliminer le bruit.
    merci

  15. #15
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Le laplacien te trouvera les coutours, c'est sûr, mais c'est une technique de base. LE gradient, il te faudrait le faire en 3D, donc en faire 3, et les résultats sont pas géniaux non plus, surtout en présence de bruit, et le bruit en IRM...

    Si tu veux éliminer le bruit, un filtrage gaussien, ou un filtrage plus complexe pour ôter le bruit spécifique - genre poivre et sel peut-être, mais il faudrait que tu calcules d'abord l'histogramme de ton bruit, par exemple à l'extérieur du cerveau -

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    le probleme, c'est que les bruits correspondent a l'os et le gras qui entourent le cerveau, que j'ai enlevé apres seuillage pour laisser que mon cerveau. mais, ce bruit est aussi en blanc comme mon cerveau. et des fois un peu grand.
    comment faire alors.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    et je n'ai pas pu choisir un seuil plus grand, pour les éliminer, sinon une partie de mon cerveau partira.
    merci

  18. #18
    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
    Soit j'ai mal compris le problème, soit je me suis mal fait comprendre. Dans les 2 cas, en début de semaine, c'est hautement probable .

    On résume :

    Tu as une image (de cerveau, mais peu importe) déjà seuillée. Autrement dis une image binaire dans laquelle ton cerveau est en blanc et le fond en noir. Tu as des trous noirs dans ton cerveau blanc. Ce sont ces trous que tu veux peindre en blanc.

    Pour simplifier l'algorithme, tu dessines en blanc le contour de l'image. Pas le contour de l'objet mais le bord de l'image. Ca veut dire qu'on met les pixels qui sont sur le bord de l'image en blanc.. En pseudo-code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Pour x = 0 à largeur
           pixel(x, 0) = blanc
           pixel(x, hauteur - 1) = blanc
    Fin Pour
     
    Pour y = 0 à hauteur
           pixel(0, y) = blanc
           pixel(largeur - 1, y) = blanc
    Fin Pour
    C'est tout.

    Ensuite tu pars du pixel(1, 1) et etc, etc, comme je l'ai décrit précédemment.

    Si j'ai mal compris le problème, expose-le de nouveau, stb.

    Flo.

  19. #19
    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
    Il se peut que ce soit ton seuillage qui soit problématique.

    En général, il est rare d'avoir une image qu'on puisse "simplement" seuiller. Seules quelques applications en vision industrielle, peuvent l'envisager.

    Sur ces applications, on sait à quoi on s'attend (objets identiques issus de process industriels), on sait ce qu'on veut voir, on maîtrise les éclairages, tous les éléments de la scène, etc. Donc l'image, à la sortie du capteur est quasiment binaire.

    Mais en général un "simple" seuillage ne parvient pas à extraire de manière convenable un objet.

    On applique toujours des pré-traitements : élimination de bruit(filtre médian, etc.), rehausseurs de contraste (clahe, wallis, égalisation d'histos, etc), etc.

    On peut directement travailler sur l'image en niveaux de gris pour isoler l'objet d'intérêt. Tu peux donc faire un algo de croissance sur l'image en niveau de gris, utiliser des contours actifs (courant sur des images médicales), faire du clustering, etc, etc.

    Ou alors on fait du seuillage dynamique (seuillage de otsu) voire adaptatif et même mixer les 2.

    Donc si ton image binaire est trop "sale", il faut au minimum la pré-traiter.

    Si ensuite la "simple" binarisation n'aboutit toujours pas à quelque chose de convenable il faut opter pour des méthodes de seuillage plus fines ou travailler directement dans l'image en niveaux de gris.

    Disons que boucher les trous, c'est résoudre les problèmes en fin de traitement. Il vaut mieux essaie d'agir à la source si tu vois ce que je veux dire .... .

    A+

    Flo.

    PS : l'outil "baguette magique" (magic wand) de certains éditeurs graphiques (gimp, photoshop, etc.) est un exemple d'algorithme à croissance de région dont la graine est le clic de l'utilisateur. Donc si tu prends ton image en niveau de gris et que tu parviens à sélectionner avec la baguette magique juste la partie du cerveau qui t'intéresse alors tu devrais plutôt partir vers une détection de ton objet directement à partir de l'image en gris que de faire un simple "seuillage".

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    desole, si je me suis mal faite comprendre !! je recommance !! attention au mal de tete !!
    mon but est d'avoir que le cerveau (qui est en NG ) des images en FLAIR d'IRM, sans la graisse et l'os qui l'entoure (qui sont aussi en niveau de gris mais plus clair que le cerveau). mais pour m'aider a segmenter, on m'a donné d'autres images de type difusion.
    donc j'ai seuillé les images de diffusion pour enlever la graisse et l'os qui entourent le cerveau, j'ai réussi, mais j'ai quand meme qq pixels qui sont resté (qui sont de la meme couleur que mon cerveau). et j'ai aussi obtenu des trous dans mon cerveau.
    donc, j'ai pensé a enlever les bruits, puis faire remplissage des trous. et cette image obtenu ( qui est un masque), je la compare avec les imagesen FLAIR, pour avoir les NG qui correspondent a mon cerveau.
    alors, c'est plus clair maintennant?
    merci

Discussions similaires

  1. Détection position des yeux dans une image
    Par Morvan Mikael dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 24/12/2008, 23h09
  2. diffusion des pixels d'une image
    Par hagui dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 11/05/2006, 18h31
  3. Une infobulle à partir des coordonnées sur une image
    Par dark_vidor dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/01/2006, 21h20
  4. [MFC]déplacement des pixels d'une image
    Par hagui dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2006, 16h51
  5. utiliser des morceaux d'une image pour faire des boutons
    Par Battosaiii dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 14/12/2005, 00h05

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