Bonjour,
Dans le cadre d'un projet j'ai dû développer un programme matlab pour analyser des cellules de la plaque de croissance des tibias de rats. Jusqu'à présent, tout fonctionne. Les images sont des stack d'images (piles d'images contenant plusieurs images 2D appelées slices) en format .lsm provenant d'un microscope confocal Zeiss et tous les traitements d'images sont alors réalisés en 3D.
Les images sont d'abord filtrées par un filtre gaussien en 3D, puis normalisées selon la méthode d'égalisation adaptative d'histogramme limitée en contraste (CLAHE en anglais). Enfin, le thresholding est appliqué aux images pour obtenir des images binaires.
Cependant, sur nos images, certains cellules sont tellement proches sur certaines slices qu'elle apparaissent connectées après le thresholding, mais elles sont bien distinctes sur les autres slices. Du coup, cela les rend non analysables car les mesures de volume total et longueur/largeur qui se basent sur les dimensions en terme de pixels/voxels vont être tronquées.
Pour pallier à ce problème, j'ai donc pensé qu'il serait judicieux d'utiliser la méthode du watershed segmentation, qui sépare les objets. J'ai fait un premier essai avec un méthode qui existe déjà dans matlab :
ImNumber est le nombre d'images au total présentes dans mon stack.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 for val=1:ImNumber(2) Stack2(val).data=~bwareaopen(~Stack(val).data,5); D(val).data=-bwdist(~Stack(val).data); Ld(val).data=watershed(D(val).data); Stack2(val).data=Stack(val).data; Stack2(val).data(Ld(val).data==0)=0; mask(val).data=imextendedmin(D(val).data,10); D2(val).data=imimposemin(uint8(D(val).data),uint8(mask(val).data)); Ld2(val).data=watershed(D2(val).data); Stack3(val).data=Stack(val).data; Stack3(val).data(Ld2(val).data==0)=0; end
Stack(val).data correspond à l'image n° val.
Cependant, cette méthode réalise un watershed différent pour chaque slice séparément sans réellement prendre en compte la structure 3D des cellules...
J'ai essayé la fonction watershed du logiciel ImageJ et ça fonctionne à merveille ! Je cherche donc à reproduire exactement la même chose dans matlab mais je ne sais pas par où commencer.
Quelqu'un saurait-il comment procéder pour implémenter ça ou l'aurait déjà fait ? J'ai essayé de chercher car j'imagine que des personnes ont dû coder ça avant moi mais je n'ai pas trouvé de code fonctionnant sur matlab avec mon type d'image...
Merci beaucoup, n'hésitez pas si vous avez des questions, je ne suis pas sûre que tout soit très clair !
Partager