Table of Contents
Commit 2009-03-27
Modifications apportées au mailleur Geniso
Conservation des bords du maillage
Geniso ayant été créé pour des surfaces fermées, rien n’avait été prévu pour conserver les bords d’un maillage d’une surface ouverte. Ces bords étaient donc déplacés lors du Vertex Clustering et lors de l’optimisation du maillage. Dans la version actuelle ces noeuds frontières sont détectés et fixés.
Pré-traitement de l’image fournie
Dans l’ancienne version, une classe GenisoImage
avait été créée pour la définition des images. Une image vtk était donc chargée puis transformée en format GenisoImage
. Des fonctions de calcul de carte de distance et d’interpolation, utilisant ce format GenisoImage
étaient ensuite appliquées.
Lors du passage en C++, le format d’image GenisoImage
a été supprimé afin de garder en permanence le format vtk ; ce qui permet d’éviter des changements de formats couteux en temps de calcul, d’utiliser plus facilement les fonctions vtk et d’éviter de devoir re-implémenter des fonctions toutes faites dans vtk.
De plus, le ré-échantillonnage de l’image initiale et le calcul de la carte de distance ont été modifiés afin de donner la possible de fournir des images segmentées comportant plusieurs régions au mailleur et mailler les différentes interfaces simultanément.
Génération de maillages compatibles entre différentes régions
Contexte
Le mailleur Geniso a été créé dans le cadre du projet « biomec » pour générer des maillages du cerveau au départ d’images médicales segmentées. Ceci permettrait de s’affranchir de l’utilisation d’Isosurf
utilisé jusqu’à présent. En effet, si les maillages fournis par Isosurf sont généralement de bonne qualité, Isosurf
ne permet pas de traiter le cas d’une image contant plusieurs régions et de générer un maillage compatible entre ses régions. Ainsi Lara était forcée de procéder à un fameux bricolage pour obtenir un maillage du cerveau contenant une tumeur. Le maillage obtenu était bien compatible à l’interface, mais comportait des éléments de très mauvaise qualité à l’interface cerveau-tumeur. La création d’un nouveau mailleur surfacique était donc la seule manière de s’en sortir.
Méthode en bref
Modification de l’algorithme du Marching Tetrahedra pour pouvoir générer directement des maillages compatibles. Il n’a y donc pas de collage de maillages surfaciques, le maillage complet est généré en une seule fois et est directement « correct ». Dans l'algorithme les voxels de l'image segmentée sont parcourus par blocs de 8. En fonction de la valeur des voxels aux 8 sommets du cubes ainsi formé, on peut connaitre et approximer par une triangulation la manière dont le cube est intersecté par la surface. Afin de générer des maillages compatibles, j'ai généralisé la méthode pour le cas ou l'image segmentée ne contient plus seulement 2 valeurs distinctes mais 3 voir plus de valeurs différentes. Pour l'instant, l'algorithme permet de gérer les cas où trois surfaces se rejoignent en un point mais non le cas où 4 surfaces se rejoignent (ce qui arrive beaucoup plus rarement en imagerie médicale mais bien quand deux fonctions implicites se croisent…).
Quelques images
image fournie en entrée de Geniso
cas test BrainAndTumor.py, tumeur interne visible
cas test BrainAndTumor.py, visualisation de l'interface cerveau - tumeur
cas test BrainAndTumor.py, tumeur vue de l'intérieur du cerveau
cas test BrainAndTumorAndVentricle.py
cas test iceCream.py, maillages compatibles au départ de deux fonctions implicites
Définition de fonctions implicites
Malgré que Geniso ait été conçu pour la génération de maillages au départ d’images, on a laissé la possibilité de générer des maillages au départ de la définition implicite de fonctions. Cependant, la définition de fonctions implicites se fait maintenant à l’aide de vtk. Ceci permettait en effet d’alléger fortement le code C++, puisque la création d’une fonction implicite d’une image vtk donne également lieu à une vtkImplicitFunction
et donc je peux utiliser des vtkImplicitFunction
dans tout le code, que le maillage soit généré au départ d’une image ou au départ d’une fonction implicite.
Suppression du Vertex Clustering pour la partie imaging
Le Vertex Clustering a été supprimé (en tous cas quand on travaille au départ d'images) car il générait trop d’erreurs, surtout lorsqu’on travaille des maillages compatibles. Il est évidement possible d’éviter ces erreurs mais la méthode devait compliquée est inutile depuis que l'on travaille en C++ puisque la diminution considérable du temps de calcul nous permet maintenant d’optimiser notre maillage sans réduire le nombre de nœuds.
Utilisation plus automatique de TetGen
Une fonction geniso2TetGen()
permet d’écrire le fichier d’entrée temp.poly
de TetGen en fonction du nombre de régions. Pour que la méthode soit automatique, cette fonction nécessite, en plus de la connaissance du maillage, la connaissance des cartes de distances euclidiennes car pour chacune des régions, il faut définir un point appartenant à cette région (qui ici sera la position du maximum de la carte de distance correspondante). C'est pourquoi elle a été créée à l'intérieur même de Geniso, où toutes les infos nécessaires sont accessibles.
cas test BrainAndTumorAndVentricle.py, maillage volumique et visu à l'aide de TetView
Organisation du dossier Geniso
- /src
- /-src
- /tests
- sphere.py : Fonction implicite : sphere, cas tests le plus simple
- sphere2.py : Fonction implicite : demi-sphère, permet de tester la conservation des bords
- plane.py : Fonction implicite : plan
- quadric.py : Union de deux fonctions implicites (ellipsoides). Ce serait bien de pouvoir fournir ces deux fonctions implicites séparément à Geniso et des générer des maillages compatibles aux interfaces – pour l’instant ce n’est pas possible car sur le cercle d’intersection il y’a intersection entre 4 domaines différents (4 valeurs différentes aux sommets des tétras)
- iceCream.py : Deux fonctions implicites : cône et sphère, ces fonctions ont un plan commun : le sommet du cône. Les deux fonctions implicites sont fournies séparément à geniso qui créé un maillage des deux régions, avec un maillage commun à l’interface cône – sphère. Permet de tester les maillages compatibles mais pour des fonctions implicites
- concentricSpheres.py : Deux fonctions implicites : petite sphère à l’intérieur d’une grosse sphère. Les deux fonctions implicites sont fournies séparément à Geniso.
- brainAndTumor.py : Image : cerveau (valeur 3) tumeur (valeur 4), test génération de maillages compatibles
- brainAndTumorAndVentricle.py : Image : cerveau + tumeur + ventricules
- /tools
- generalTools.py : Fonctions générales toujours utilises : load, save, cast ,vtkToTetGen, vtkImageToCPP, …
- imagingTools.py : Fonctions de traitement d’images : threshold, carte de distance, interpolation, …vtkImageToCPP, …
- meshingTools.py : Tout ce qui concerne la génération et la modification de maillges: appel geniso, appel isosurf, appel tetgen, …
- gui2.py : Super pour la visu de maillages
- vtkToolsGui.py : Gui contenant plusieurs fonctions utilisées pour visualiser images et maillages. La version de Romain a été un peu modifiée pour mieux correspondre à mes besoins…
Comment utiliser Geniso
Maillage surfacique au départ d’une fonction implicite
Utiliser la function meshingTools.callGenisoImplicitFunction (vtkImplicitFuncion , dimX, dimY, dimZ, spX, spY, spZ, orX, orY, orZ)
Maillage surfacique au départ de deux fonctions implicites
Utiliser la function meshingTools.callGeniso2ImplicitFunctions (vtkImplicitFuncion1 ,vtkImplicitFuncion2,
dimX, dimY, dimZ, spX, spY, spZ, orX, orY, orZ)
Maillage surfacique au départ d’une image segmentée (contenant une ou plusieurs régions)
Utiliser la function meshingTools.callGenisoImage(vtkImageData, res)
Fichiers ajoutés ou supprimés
Adding: D:\Metafor\Meta\oo_meta\geniso\data Adding: D:\Metafor\Meta\oo_meta\geniso\data\patient02_06_segTumorAndBrainAndVentricleSmoothed.vtk Adding: D:\Metafor\Meta\oo_meta\geniso\data\patient02_06_segTumorAndBrainSmoothed.vtk
Adding: D:\Metafor\Meta\oo_meta\geniso\src\gisoGeneralTools.cpp Adding: D:\Metafor\Meta\oo_meta\geniso\src\gisoGeneralTools.h Adding: D:\Metafor\Meta\oo_meta\geniso\src\gisoImagingTools.cpp Adding: D:\Metafor\Meta\oo_meta\geniso\src\gisoImagingTools.h
Adding: D:\Metafor\Meta\oo_meta\geniso\tests\brainAndTumor.py Adding: D:\Metafor\Meta\oo_meta\geniso\tests\brainAndTumorAndVentricle.py Adding: D:\Metafor\Meta\oo_meta\geniso\tests\concentricSpheres.py Deleting: D:\Metafor\Meta\oo_meta\geniso\tests\cpp Adding: D:\Metafor\Meta\oo_meta\geniso\tests\iceCream.py Adding: D:\Metafor\Meta\oo_meta\geniso\tests\plane.py Deleting: D:\Metafor\Meta\oo_meta\geniso\tests\py Adding: D:\Metafor\Meta\oo_meta\geniso\tests\quadric.py Adding: D:\Metafor\Meta\oo_meta\geniso\tests\sphere.py Adding: D:\Metafor\Meta\oo_meta\geniso\tests\sphere2.py
Deleting: D:\Metafor\Meta\oo_meta\geniso\tools\appelFonctionsCpp Deleting: D:\Metafor\Meta\oo_meta\geniso\tools\appelFonctionsPython Adding: D:\Metafor\Meta\oo_meta\geniso\tools\generalTools.py Adding: D:\Metafor\Meta\oo_meta\geniso\tools\gui2.py Adding: D:\Metafor\Meta\oo_meta\geniso\tools\imagingTools.py Adding: D:\Metafor\Meta\oo_meta\geniso\tools\meshingTools.py Adding: D:\Metafor\Meta\oo_meta\geniso\tools\renderingTools.py Deleting: D:\Metafor\Meta\oo_meta\geniso\tools\vtk Adding: D:\Metafor\Meta\oo_meta\geniso\tools\vtkToolsGUI.py
— Vinciane d'Otreppe 2009/03/27 11:38