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.
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.
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.
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…).
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
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.
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.
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
Utiliser la function meshingTools.callGenisoImplicitFunction (vtkImplicitFuncion , dimX, dimY, dimZ, spX, spY, spZ, orX, orY, orZ)
Utiliser la function meshingTools.callGeniso2ImplicitFunctions (vtkImplicitFuncion1 ,vtkImplicitFuncion2,
dimX, dimY, dimZ, spX, spY, spZ, orX, orY, orZ)
Utiliser la function meshingTools.callGenisoImage(vtkImageData, res)
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