====== 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 ===
{{:commit:2009:brainandtumorimagevtk.jpg?200| image vtk}} image fournie en entrée de Geniso
{{:commit:2009:brainandtumor_7.jpg?200| cas test BrainAndTumor.py }} cas test BrainAndTumor.py, tumeur interne visible
{{:commit:2009:brainandtumor_smooth_2.jpg?200| cas test BrainAndTumor.py}} cas test BrainAndTumor.py, visualisation de l'interface cerveau - tumeur
{{:commit:2009:brainandtumor_smooth.jpg?200| cas test BrainAndTumor.py}} cas test BrainAndTumor.py, tumeur vue de l'intérieur du cerveau
{{:commit:2009:brainandtumorandventricle_4.jpg?200| cas test BrainAndTumorAndVentricle.py}} cas test BrainAndTumorAndVentricle.py
{{:commit:2009:icecream_11.jpg?200| icecream}} 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.
{{:commit:2009:brainandtumorandventricle.jpg?200 | volume mesh}} 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
--- //[[vdotreppe@ulg.ac.be|Vinciane d'Otreppe]] 2009/03/27 11:38//