# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  remplissage des trous d'une image.

## benyasla

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

----------


## Matthieu Brucher

Quels trous ?

----------


## Flo.

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 gnral on s'arrange pour que l'objet d'intrt (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 insr 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 rgions. Tous les pixels de ton fond (si tu as un fond en "1 lment") 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.

----------


## FrancisSourd

> Quels trous ?


Les trous de mmoire?

----------


## benyasla

bonjour flo
merci beaucoups pour ton aide !! c'etait tres bien expliqu !! 
justement, j'ai dja 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

----------


## benyasla

par hazard, c'est pas plus simple si je fais une dilataion puis rosion? ou on a un meilleur rsultat avec la methode de croissance de rgion.
merci

----------


## Flo.

Pas du tout, une bonne comprhension 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 coordonnes 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'insreras 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 mme   ::D:  .

Donc le bord de l'image en blanc. 

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

La suite dpend 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 mmorisera 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  (dsol je suis pas habitu  ce type d'exercice):



```

```

Ensuite tu fais un OU EXCLUSIF entre l'image ainsi obtenue et l'image original. Comme seul le fond de l'image diffre 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.

----------


## Flo.

L'inconvnient 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 faon sure ... avec une grosse dilatation suivie d'une grosse rosion, tu vas dformer 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 gnral une fermeture est faite sur une image dont on ne se soucit pas de garder les dtails. Pour localiser un objet dans sa totalit, pour compter les objets (et recoller les ventuels fragments), etc) ... et dont on connat les et nature des trous (bruit de binarisation, etc). C'est du gnral bien sur.

Si les dtails de l'objet sont importants il vaut mieux boucher les trous pour ne pas toucher  ces dtails.

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 bouchs indpendamment de leur taille.

A toi de voir.

Flo.

----------


## Matthieu Brucher

LA croissance de rgion peut se faire par rosion et dilatation. Fais un peu de recherche sur la morphologie mathmatique, a t'aidera - un bouquin de base expose la croissance de rgion.

----------


## Flo.

> LA croissance de rgion peut se faire par rosion et dilatation


T'es sur de a ?

Les oprations 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 mme objet, suffisamment loigns pour ne pas appartenir  un mme voisinage, pourraient-ils se "connatre" dans le cadre d'rosions ou de dilatations ?

Par contre elles dtruisent irrversiblement 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 rgion peut se faire de manire linaire (temps de calcul constant  taille d'image donne et indpendant 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 dcrite : l'objet est trouv dans son entier en seule passe (mais en temps de calcul variable  taille d'image donne et dpendant de la nature de l'objet).

Outre ses 2 mthodes, je ne vois pas comment cela peut se faire diffremment. D'un autre ct je suis loin de prtendre tout savoir   ::D:  .

Peux-tu nous donner plus d'explication sur ta mthode, stp ? Sur le web, j'ai jamais vu a   ::?:  

Flo.

----------


## benyasla

milles merci, je ferai donc la methode de croissance de rgions, je vous fais entierement confiance !!
bonne journe, la mienne a tres bien commenc !!
merci

----------


## Matthieu Brucher

oui, mais en plusieurs itrations - il y a aussi 2-3 autres petites oprations  faire, genre retirer l'extrieur  chaque fois -. Du moins je crois. Faudraitq ue je recherche le livre dans lequel c'tait indiqu  ::|:

----------


## benyasla

je commencerai a utiliser le code que m'a donn flo. mon responsable de stage est d'accord aussi pour cette mthode, a ce qu'il parait a donne un meilleur rsultat que  la fermeture, surtout que parfois les trous sont assez grand.
dja, je vais commencer a penser comment avoir que mon contour de l'image !!

----------


## benyasla

bonsoir
je voudrai encore vous demander, quelle mthode 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'enlve avant de commencer a faire la croissance de region. et donc aussi, qu'est ce que vous me conseillez comme mthode pour liminer le bruit.
merci

----------


## Matthieu Brucher

Le laplacien te trouvera les coutours, c'est sr, mais c'est une technique de base. LE gradient, il te faudrait le faire en 3D, donc en faire 3, et les rsultats sont pas gniaux non plus, surtout en prsence 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 spcifique - genre poivre et sel peut-tre, mais il faudrait que tu calcules d'abord l'histogramme de ton bruit, par exemple  l'extrieur du cerveau -

----------


## benyasla

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.

----------


## benyasla

et je n'ai pas pu choisir un seuil plus grand, pour les liminer, sinon une partie de mon cerveau partira.
merci

----------


## Flo.

Soit j'ai mal compris le problme, soit je me suis mal fait comprendre. Dans les 2 cas, en dbut de semaine, c'est hautement probable   ::D:  .

On rsume :

Tu as une image (de cerveau, mais peu importe) dj seuille. 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 :



```

```

C'est tout.

Ensuite tu pars du pixel(1, 1) et etc, etc, comme je l'ai dcrit prcdemment.

Si j'ai mal compris le problme, expose-le de nouveau, stb.

Flo.

----------


## Flo.

Il se peut que ce soit ton seuillage qui soit problmatique.

En gnral, 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 matrise les clairages, tous les lments de la scne, etc. Donc l'image,  la sortie du capteur est quasiment binaire.

Mais en gnral un "simple" seuillage ne parvient pas  extraire de manire convenable un objet.

On applique toujours des pr-traitements : limination de bruit(filtre mdian, 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'intrt. Tu peux donc faire un algo de croissance sur l'image en niveau de gris, utiliser des contours actifs (courant sur des images mdicales), faire du clustering, etc, etc.

Ou alors on fait du seuillage dynamique (seuillage de otsu) voire adaptatif et mme 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 mthodes de seuillage plus fines ou travailler directement dans l'image en niveaux de gris.

Disons que boucher les trous, c'est rsoudre les problmes en fin de traitement. Il vaut mieux essaie d'agir  la source si tu vois ce que je veux dire ....   ::D: .

A+

Flo.

PS : l'outil "baguette magique" (magic wand) de certains diteurs graphiques (gimp, photoshop, etc.) est un exemple d'algorithme  croissance de rgion dont la graine est le clic de l'utilisateur. Donc si tu prends ton image en niveau de gris et que tu parviens  slectionner avec la baguette magique juste la partie du cerveau qui t'intresse alors tu devrais plutt partir vers une dtection de ton objet directement  partir de l'image en gris que de faire un simple "seuillage".

----------


## benyasla

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

----------


## benyasla

desole, j'avais mal compri !! vous m'aviez dit ce matin de faire le contour de l'image, j'ai compris le contour de mon objet, c'est pour a que je vous ai pos la question apres !!
vraiment dsol. 
alors, je suis sur la bonne voix ? apres vous avoir expliquer exactement mon travail !!?
merci

----------


## Flo.

OK, c'est bien  ce problme que je rpondais   ::D: .

Donc je parlais des pixels qui appartiennent au bord de l'image, et non pas au bord de l'objet.

Si tu as quelques pixels parasites blancs dans ton fond c'est pas grave pour l'algo de remplissage des trous. Il conservera ces parasites : ils ne seront absoluement pas modifis (except si ils contiennent des trous).

Tu pourras les enlever aprs soit avec une ouverture (si tu n'as pas peur de trop dformer ton objet), soit avec une simple rosion (aprs tout pourquoi pas) si c'est un bruit constant de taille gale  1 pixel, soit avec une segmentation suivie d'une suppression des objets de petite taille si ton bruit est de taille variable.

A+

Flo.

----------


## Flo.

Ben faudrait voir quelques images pour pouvoir dire  ::D:  .

Flo.

----------


## benyasla

j'aurai aim avoir du bruit a la meme place !! j'ai a peu pres 300 images, et le bruit se trouve a chaque fois dans un endroit different, et de tailles differentes !! et mon programme devra marcher sur toutes les images !! eet oui, c'est un grand probleme. donc, je devrai quand meme commencer par ton algorithme, avant de penser a liminer le bruit !!? le bruit ne gnera pas?
merci

----------


## ToTo13

Bonjour,

quelques petits dtails :
 - pour la croissances des rgions, il faut faire attention de pas exploser la pile d'excution. J'ai eu le souci sur des images 1024*1024.
 - Pour boucher les trous, tu n'as pas forcment besoin d'enlever tout le bruit, tu peux tout simplement travailler sur ce que l'on pourrait appeller un masque.

Bon courage...

----------


## benyasla

merci pour ta reponse !!

----------

