Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


doc:user:geometry:mesh:geniso

This is an old revision of the document!




Mailleur Biomec GenIso

Ce mailleur permet de générer un maillage surfacique 3D au départ d'une image tridimensionnelle segmentée.

Maillage mono-matériau

L'input est image 3D segmentée binaire. Elle contient donc deux valeurs, les voxels ayant pour valeur 0 sont localisés hors de l'objet à mailler, les voxels intérieurs à l'objet ont quant à eux une valeur non nulle.

Arrangez-vous pour que votre image de départ soit au format .vtk ou, encore mieux, au format .vti qui est plus compact. Si ce n'est pas le cas, utilisez Slicer3D, Paraview ou mon interface geniso/tools/gui4.py pour changer le format de l'image.

Commencez par charger les utilitaires geniso

 import geniso.tools.generalTools as generalTools
 import geniso.tools.meshingTools as meshingTools
 import geniso.tools.imagingTools as imagingTools

Chargez l'image:

 image = generalTools.loadVtkImageXML(imageFileName)

Ensuite, utilisez la série de commandes suivantes pour générer un maillage surfacique de la frontière de l'image segmentée:

 gen = GenerateMesh(generalTools.vtkImageDataToCpp(image)) 
 gen.execute() 
 smooth = SmoothMesh(gen.getSurf()) 
 smooth.smoothWithFctFromPoly(nbr,spx,spy,spz,nmin,interpol,type)

où les paramètres sont décrits dans le tableau ci-dessous. En pratique, GenerateMesh(image).execute() crée une triangulation de la frontière de l'objet segmenté dans l'image binaire fournie. De part la discrétisation spatiale de l'image, le maillage généré n'est pas beau car non lisse, les marches d'escaliers de l'image binaire sont conservées. La classe SmoothMesh() permet d'éliminer ces irrégularités de surface tout en conservant la géométrie décrite dans les images. Elle le fait grâce à la construction d'une fonction implicite, décrite par les paramètres nmin, interpol et type (pour plus de détails: http://hdl.handle.net/2268/136159).

Récupérez ensuite votre vtkPolydata via la commande:

 poly = generalTools.genisoMeshToPolyData(smooth.getSurf())  

Pour obtenir un maillage volumique tétraédrique du volume de l'objet à partir du maillage surfacique triangulaire de la surface frontière de l'objet, utilisez TetGen:

 ugrid = meshingTools.callTetgen(poly)

Vous récupérez ainsi un vtkUnstructuredGrid. Pour le sauvegarder sur le disque: generalTools.saveUgridXML('ugrid.vtu',ugrid). Pour le visualiser, utilisez Paraview. Pour l'utiliser dans un cas-test Metafor, utilisez la classe LoadMesh implémentée dans le fichier toolbox/tetgen.py :

 groupset.add(Group(1))
 mesh = LoadMesh(domain, ugrid, groupset(1) )
 mesh.execute()

Maillage multi-matériau

Cette option permet de générer un maillage qui contient plusieurs zones matérielles: un os qui contiendrait une partie os cortical et une partie os trabéculaire par exemple; un cerveau dans lequel les ventricules et une tumeur seraient séparés; une mâchoire avec une série de dents; …

Dans le cas multi-matériau l'image segmentée représentant la géométrie doit contenir plusieurs labels: 0 pour l'extérieur de l'objet (background) et une série de valeurs positives non nulles (typiquement 1,2,3,…) pour distinguer chacun des tissus.

Pour utiliser le mailleur GenIso, il faut tout d'abord définir la fonction implicite Fct, équivalente continue de l'image segmentée discrète, et qui permettra au mailleur de fournir une interface lisse entre les maillages séparant les différentes régions.

Pour définir cette fonction, on définit les couples de labels de l'image entre lesquels on veut que le mailleur crée une triangulation. De plus, on trie ces couples de manière à définir l'objet hétérogène comme un ensemble de closed surfaces sur lesquelles viennent éventuellement se greffer des open surfaces. Dans l'image ci-dessous, une tumeur (open surface défine par le couple (4,3) vient s'attacher sur la frontière extérieure du cerveau (closed surface définie par l'union des couples (3,0) et (4,0)).

Dès lors, la syntaxe à utiliser est la suivante:

  fct = Fct()
  surf1 = fct.defineClosedSurface()
  surf1.mesh(3,0)
  surf1.mesh(4,0)
  surf2 = fct.defineOpenSurface()
  surf2.mesh(4,3)
  fct.setEpsilon(eps)
  fct.setNmin(nmin)
  fct.setType(type)
  fct.setInterpol(interpol)
  fct.setVtkImageFromPython(generalTools.vtkImageDataToCpp(image))
  fct.build()

Ensuite, nous pouvons générer le maillage au moyen des commandes:

  gen = GenerateMesh(fct)
  gen.getRegularGrid().setResolution(res)
  gen.execute()
  poly = generalTools.genisoMeshToPolyData(gen.getSurf()) // vtkPolyData

A partir de ce maillage surfacique multi-régions, on utilise TetGen pour générer le maillage volumique dans chacune des régions définies. Pour ce faire il faut spécifier à TetGen un point, seed, situé dans chacune des régions à mailler volumiquement (vous pouvez par exemple aller chercher ce point en chargeant le vtkPolyData dans l'interface graphique geniso/tools/gui4.py et en utilisant ensuite l'option point ).

  seedbrain= [118.3,160.5,75]
  seedtumor = [118,196.9,71]
  regionSeeds = [seedbrain,seedtumor]
  regionVolmax = [volmax, volmax]
  ugrid = meshingTools.callTetgenMultipleRegions(poly, regionSeeds, regionVolmax)

Ensuite, pour charger le maillage dans Metafor:

  labels = [1,2]  // les deux labels des régions dans l'ugrid (cfr. visu dans Paraview)
  grp = [groupset(1),groupset(2)] 
  
  mesh = tetgen.LoadMesh(domain, ugrid, grp)
  mesh.setFillMeshPoints(True)
  mesh.setGrpLabels(labels)
  mesh.execute()

Paramètres

Paramètre Signification et valeur conseillée
nbr nombre d'itérations de la fonction de lissage
conseil: 4
spx,spy,spz Espacement de la grille utilisée pour générer le maillage
conseil = gen.getRegularGrid().getDx(),.getDy(),.getDz()
res Résolution de la grille utilisée pour générer le maillage
conseil: image.GetDimensions()[0] si on veut garder la même grille que celle définie par l'image de départ
eps distance relative autorisée entre l'image de départ et la fonction Fct
conseil: 1./image.GetDimensions()[0] signifie une distance d'une largeur de voxel
nmin degré de lissage
conseil: entre 15 et 100
interpol 0: fct d'approximation, 1: fct d'interpolation
conseil: 0 pour une surface plus lisse, 1 pour une géométrie plus proche de l'image
type 1: linéaire, 2: quadratique
conseil: 1 pour la robustesse, 2 pour une surface plus lisse
doc/user/geometry/mesh/geniso.1372681871.txt.gz · Last modified: 2016/03/30 15:22 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki