URL: https://linuxfr.org/news/vtk-la-visualisation-scientifique-et-au-dela Title: VTK : la visualisation scientifique et au delĂ ! Authors: mzf Ysabeau đ§¶, BenoĂźt Sibaud, Pierre Jarillon et palm123 Date: 2021ćčŽ02æ03æ„T21:45:22+01:00 License: CC By-SA Tags: kitware, paraview, sciences, dataviz, imagerie_mĂ©dicale, vtk et visualisation Score: 121 VTK est une bibliothĂšque libre incontournable de la visualisation scientifique, pourtant peu citĂ©e sur LinuxFr. Rattrapons le retard !  [[VTK]] est en quelque sorte le couteau suisse de la visualisation scientifique. La suite de cet article vous donnera un aperçu de ses domaines dâutilisation en sâappuyant sur de nombreux exemples abondamment illustrĂ©s. ---- [Site officiel](https://vtk.org/) [Exemples](https://kitware.github.io/vtk-examples/site/) [Code source](https://gitlab.kitware.com/vtk/vtk) ---- # Visualisation Scientifique Le domaine dâapplication premier de [[VTK]] est la visualisation scientifique. Câest une discipline trĂšs large qui couvre les reprĂ©sentations possibles de donnĂ©es issues du domaine scientifique dans le but de les rendre interprĂ©tables par des humains : * rĂ©sultats de simulations : mĂ©tĂ©o, astrophysique, fluides...  * mesures venant de capteurs : imagerie mĂ©dicale, inspection des sols...  * donnĂ©es créées ex-nihilo : Ă©quation mathĂ©matique, donnĂ©es historiques ou gĂ©ographiques...  Une particularitĂ© de cette visualisation est de rendre les donnĂ©es comprĂ©hensibles pour lâutilisateur dans un but dâanalyse. Ătre capable de reprĂ©senter ces donnĂ©es dâune façon simple est en gĂ©nĂ©ral assez complexe ! Elles doivent ĂȘtre transformĂ©es, simplifiĂ©es, projetĂ©es sur des primitives gĂ©omĂ©triques (points, lignes, surfaces, etc.), colorĂ©es, combinĂ©es, superposĂ©es, etc. De plus ces donnĂ©es sont souvent brutes et peuvent ĂȘtre de taille considĂ©rable, de lâordre du gigaoctet ou du tĂ©raoctet, et nĂ©cessitent en gĂ©nĂ©ral plusieurs traitements lourds pour en extraire des informations pertinentes pour lâobservateur. Pour des questions de performance ces transformations doivent pouvoir sâexĂ©cuter en parallĂšle en utilisant un maximum de ressources disponibles : CPU, GPU, grappe de serveurs, etc. En 1993, seuls quelques logiciels propriĂ©taires Ă©taient capables de rĂ©pondre Ă toutes ces contraintes. Comme nous allons le voir par la suite, la publication de VTK sous une licence libre, donc gratuite, lui a permis de devenir rapidement une solution de rĂ©fĂ©rence pour des utilisateurs assez divers. # Historique VTK est lâacronyme de *Visualization Toolkit*, soit littĂ©ralement *boĂźte Ă outils de visualisation* en français. Cette bibliothĂšque est Ă lâorigine un logiciel accompagnant le livre [The Visualization Toolkit: An Object-Oriented Approach to 3D Graphics](https://vtk.org/documentation/#textbook) Ă©crit par trois chercheurs, Will Schroeder, Ken Martin et Bill Lorensen, travaillant Ă lâĂ©poque, en 1993, chez General Electric R&D. Leur propos Ă©tait de collaborer avec dâautres chercheurs et de dĂ©velopper des outils communs pour crĂ©er des applications avancĂ©es de visualisation de donnĂ©es. Leur employeur les autorisa Ă publier ce livre Ă©crit sur leur temps libre ainsi que le code source sous une licence libre.  Au dĂ©but utilisĂ© principalement en interne par General Electric pour le domaine mĂ©dical, la bibliothĂšque rencontra rapidement du succĂšs dans lâunivers de la recherche scientifique. Ceci amena deux des auteurs du livre Ă crĂ©er la sociĂ©tĂ© [Kitware](https://www.kitware.com) en 1998 pour rĂ©pondre aux demandes des utilisateurs et contributeurs que ce soit des laboratoires de recherche ou des entreprises. Au cours de son dĂ©veloppement, les applications utilisant VTK se sont diversifiĂ©es comme le traitement dâimage, la vision par ordinateur ou lâanalyse de donnĂ©es. Le livre en est aujourdâhui Ă sa quatriĂšme Ă©dition, et VTK est en version 9.0 avec une version majeure tous les 2 Ă 3 ans. Cette derniĂšre version amĂšne de [nombreuses nouveautĂ©s](https://discourse.vtk.org/t/vtk-9-0-0/3205), dont les plus visibles sont : * rendu physique rĂ©aliste, comparaison entre un matĂ©riau non mĂ©tallique Ă gauche et un autre mĂ©tallique Ă droite  * lâocclusion ambiante, qui amĂ©liore la perception de profondeur  * Ă©lĂ©ments de maillage de type BĂ©zier  Ces nouvelles fonctionnalitĂ©s permettent des rendus rĂ©alistes modernes comme vous pouvez le constater parcourant la [chaĂźne vidĂ©o de Kitware](https://vimeo.com/kitware) : [](https://vimeo.com/473470991) [](https://vimeo.com/473470865) [](https://vimeo.com/473470813) # Kitware Petite parenthĂšse sur Kitware, cette entreprise assez particuliĂšre qui dĂ©veloppe VTK.  Vous connaissez peut-ĂȘtre dĂ©jĂ Kitware pour ses nombreux autres logiciels libres : [CMake](https://cmake.org/), [CDash](https://www.cdash.org/), [ITK](https://itk.org), [Paraview](https://www.paraview.org/)... qui naviguent tous autour de lâunivers de la visualisation et du dĂ©veloppement logiciel de grande ampleur. Kitware est une sociĂ©tĂ© amĂ©ricaine, avec une succursale Ă Lyon en France, dâenviron 150 personnes qui dĂ©veloppe les outils sus-citĂ© et en propose la maintenance ainsi que des formations et des dĂ©veloppements spĂ©cifiques. Fait rare, son *CEO*, [Lisa Avila](https://www.kitware.com/lisa-avila), est une femme et [lâĂ©quipe dirigeante](https://www.kitware.com/leadership-management/) est aussi partiellement fĂ©minine. Autre point positif, lâentreprise est dĂ©tenue Ă 100% par ses employĂ©s [depuis peu](https://blog.kitware.com/kitware-becomes-100-percent-employee-owned/). Dâailleurs dans un [article rĂ©cent](https://www.bizjournals.com/albany/news/2020/10/13/kitware-growing-software-development-talent.html) on apprend que lâentreprise a du mal Ă recruter. Les profils recherchĂ©s, techniquement pointus, amĂšnent Kitware Ă rentrer en concurrence avec les gĂ©ants amĂ©ricains de lâinformatique comme Google ou Amazon. Comme beaucoup dâentreprises qui dĂ©veloppent des logiciels libres, le modĂšle Ă©conomique de Kitware semble ĂȘtre un mĂ©lange entre du dĂ©veloppement spĂ©cifique de niche autour de leurs outils, et de la formation couplĂ© Ă de la maintenance pour utilisateurs avancĂ©s. De plus, en parcourant leur blog on peut constater que Kitware participe Ă beaucoup de projets de recherche amĂ©ricains et europĂ©ens. Comme lâexplique Lisa Avila dans cet [article](https://www.saratoga.com/saratogabusinessjournal/2019/10/lisa-avila-moves-from-ge-research-unit-to-help-form-kitware-inc-in-clifton-park/), chaque client a des besoins trĂšs spĂ©cifiques ce qui demande beaucoup dâaccompagnement commercial avec un suivi financier efficace pour garantir la pĂ©rennitĂ© des projets de recherche. # Principes de fonctionnement de VTK Passons Ă la technique ! Le cĆur de VTK est dĂ©veloppĂ© en C++, mais il existe de nombreux portages et il est ainsi possible de sâen servir en Tcl, Python, Jupyter (via [Paraview Jupyter Kernel](https://blog.kitware.com/paraview-jupyter-notebook/)), Visual Basic, C# (via [ActiViz](https://www.kitware.eu/activiz/)), Java, Javascript (via [vtk.js](https://blog.kitware.com/vtk-js-the-visualization-toolkit-on-the-web/)), Unity... et jâen oublie sĂ»rement ! VTK utilise la [programmation orientĂ©e objet](https://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_objet), câest-Ă -dire que chaque concept ou action est reprĂ©sentĂ©e par un *objet*. Un objet regroupe les donnĂ©es spĂ©cifiques Ă sa tĂąche et des actions qui peuvent sâappliquer sur ces donnĂ©es, tout en interdisant le reste du programme dây accĂ©der. Câest le principe de [lâencapsulation](https://fr.wikipedia.org/wiki/Encapsulation_(programmation)), trĂšs populaire dans les langages C++, Java, C#... Ă noter que VTK dĂ©fini aussi son [propre format de stockage de donnĂ©e](https://kitware.github.io/vtk-examples/site/VTKFileFormats/) dont les fichiers ont en gĂ©nĂ©ral lâextension *.vtk* ou lâune de ses variantes (*vtu*, *vti*, *vtp*...). Avec le temps, le format a Ă©voluĂ© et on trouve aujourdâhui Ă la fois lâancienne version texte brut, aujourdâhui obsolĂšte, ou la version plus moderne en XML. Cette derniĂšre peut contenir des donnĂ©es binaires en plus des balises XML, ce qui permet dâaccĂ©lĂ©rer le chargement, ainsi que la possibilitĂ© de lecture et Ă©criture en parallĂšle de plusieurs sections dâun mĂȘme fichier. ## Pipeline VTK fonctionne en *pipeline* configurable. Cela signifie que les donnĂ©es vont subir plusieurs transformations ou actions jusquâĂ leurs multiples reprĂ©sentations finales. En simplifiant, on peut dire VTK dĂ©fini deux familles dâobjets : les objets de donnĂ©es et les objets de traitement sur celles-ci, appelĂ©s *process* en anglais. Il existe ainsi trois type de processus : * les sources qui ne prennent rien en entrĂ©e mais qui produisent une sortie  * les filtres qui acceptent des donnĂ©es en entrĂ©e et en produisent en sortie  * les puits (*sink* en anglais) qui ont besoin de donnĂ©es en entrĂ©e mais ne produisent rien en sortie. MĂȘme sâils nâont pas de flux de sortie au sens du *pipeline*, cela nâempĂȘche pas dâeffectuer des actions dâentrĂ©e/sortie systĂšme comme de lâaffichage ou lâĂ©criture dans un fichier.  Notez que sur les illustrations ci-dessus, une seule flĂšche est reprĂ©sentĂ©e par simplification alors quâun processus peut accepter et gĂ©nĂ©rer plusieurs donnĂ©es. Donc en combinant diffĂ©rents processus on obtient une succession dâĂ©tapes qui permettent Ă partir dâune source de donnĂ©e brute dâarriver Ă de multiples reprĂ©sentations graphiques. Lâutilisation dâun *pipeline* permet aussi une mise jour automatique du rendu quand un paramĂštre change. Si la source change, tout doit ĂȘtre recalculĂ©, mais si seul un paramĂštre dâun filtre change, seules les Ă©tapes en aval seront mises Ă jour. Il existe plusieurs centaines de filtres disponibles dans VTK, couvrant de nombreux besoins. Nous allons en voir quelques-uns dans les exemples suivants. # Quelques exemples ## Jouons avec une quadrique Exemple concret adaptĂ© du VTK TextBook, imaginons quâon souhaite explorer la [quadrique](https://fr.wikipedia.org/wiki/Quadrique) suivante : $$F(x,y,z) = x^2 + 2*y^2 + 4*z^2 + 5*x*y + y*z$$ Notre fonction associe une valeur Ă tout point de lâespace Ă 3 dimensions. Pour la reprĂ©senter nous allons gĂ©nĂ©rer et afficher des surfaces de niveau et des lignes de niveau, ce qui revient mathĂ©matiquement Ă dessiner lâensemble des points $(x,y,z)$ pour lesquels $F(x,y,z) = K$ avec $K$ une constante. Construisons notre *pipeline* qui doit contenir une source, des filtres et pour finir un systĂšme de rendu. PremiĂšre Ă©tape : la source, qui est de type *vtkQuadric*, un objet bien pratique qui reprĂ©sente une quadrique. On Ă©chantillonne cette source avec un *vtkSampleFunction* pour obtenir un ensemble discret de points, que lâon va ensuite passer dans un filtre de contour *vtkContourFilter* qui extrait des surfaces dont les points ont la mĂȘme valeur. Ă cette Ă©tape les surfaces ne sont que des objets mathĂ©matiques sans rĂ©alitĂ© physique. Il faut donc utiliser un *vtkPolyDataMapper* pour les associer Ă des primitives graphiques dans le but de leur affichage. Dans notre cas ces primitives sont des triangles colorĂ©s en fonction de la valeur des points des diffĂ©rentes surfaces. DerniĂšre Ă©tape, il faut placer nos primitives dans la scĂšne 3D via un acteur *vtkActor* liĂ© Ă la fenĂȘtre graphique, elle-mĂȘme combinaison de plusieurs objets : *vtkRenderer*, *vtkRenderWindow*, *vtkRenderWindowInteractor*... Le concept dâacteur permet dâajouter des transformations spatiales (translation/rotation/homothĂ©tie/etc.) Ă des primitives indĂ©pendamment de lâespace de rendu. Si on reprĂ©sente graphiquement notre *pipeline*, elle ressemble à ça :  Et le rĂ©sultat :  On observe ainsi les diffĂ©rentes surfaces de niveau colorĂ©es. Complexifions maintenant en superposant dâautres visualisations de cette mĂȘme source. Pour extraire et afficher des lignes de niveau sur plusieurs plans, nous allons utiliser un extracteur de volume *vtkExtractVOI* qui permet de travailler sur un sous-ensemble dâĂ©chantillons. Dans notre cas ces Ă©chantillons seront situĂ©s sur un plan. La suite est similaire Ă la visualisation prĂ©cĂ©dente en utilisant un filtre de contour qui va cette fois-ci extraire des segments au lieu des surfaces. Les primitives graphiques vont ainsi ĂȘtre des lignes et on utilisera aussi un acteur *vtkActor* pour placer le dessin dans la mĂȘme fenĂȘtre de rendu. Dans la reprĂ©sentation graphique du *pipeline*, on trouve ainsi deux branches qui partent de la mĂȘme source et finissent dans la mĂȘme scĂšne de rendu mais en passant par des filtres diffĂ©rents : lâune pour les surfaces de niveau, lâautre pour les lignes de contours.  rĂ©sultat :  Mais on nây voit rien ! Câest Ă cause des reprĂ©sentations superposĂ©es. On peut alors soit jouer sur la transparence pour rendre les lignes visibles, soit les dĂ©placer dans le rendu final grĂące Ă lâobjet « acteur » associĂ© :  Et en rajoutant une boĂźte englobante pour mieux se situer dans lâespace :  ## Rendu volumique Exemple un peu plus avancĂ©, nous allons travailler sur une source volumique qui contient des informations pour chaque [voxel](https://fr.wikipedia.org/wiki/Voxel) dâun espace 3D. Câest le cas typique de donnĂ©es venant d'[imagerie par rĂ©sonance magnĂ©tique (IRM)](https://fr.wikipedia.org/wiki/Imagerie_par_r%C3%A9sonance_magn%C3%A9tique). Pour se reprĂ©senter les choses, on peut utiliser lâanalogie dâun grand Rubik's cube avec une valeur associĂ©e Ă chaque case.  Voici la version *Rubik's cube* de nos donnĂ©es :  Difficile de comprendre ce quâil y a Ă lâintĂ©rieur ! Si on reprend les mĂ©thodes dĂ©crites dans lâexemple prĂ©cĂ©dent, on peut imaginer plusieurs façons de visualiser ces donnĂ©es : * projeter la valeur de chaque voxel sur un point de lâespace 3D, comme lâimage *rubik's cube* ci-dessus * afficher des lignes de contours ou des surfaces de contours   Mais comme on le voit dans les captures dâĂ©cran ci-dessus, les surfaces comportent des trous car les diffĂ©rentes parties (peau, crĂąne, etc.) sont reprĂ©sentĂ©s par une plage de valeur et non plus par une seule valeur. On peut Ă©videmment superposer plusieurs surfaces, mais il est toujours difficile de percevoir lâintĂ©rieur du modĂšle, ce qui est pourtant le but recherchĂ© en imagerie mĂ©dicale (recherche de tumeur par exemple) :  La solution ? Utiliser le lancer de rayon (*raycasting*) ! LâidĂ©e est de faire partir un rayon pour chaque pixel de lâimage de rendu. Ce rayon va traverser notre volume voxĂ©lisĂ© et recueillir des informations Ă chaque cube traversĂ©. Il suffira ensuite de se servir de ces informations pour dĂ©finir la couleur du pixel de lâimage. Il existe de nombreuses façons de faire ce dernier calcul en fonction de ce que lâutilisateur souhaite afficher. On peut citer : * utiliser la moyenne des valeurs des cubes traversĂ©s ; * utiliser la valeur maximale des cubes traversĂ©s, abrĂ©gĂ© MIP pour *[maximum intensity projection](https://en.wikipedia.org/wiki/Maximum_intensity_projection)* ; * utiliser la valeur minimale des cubes traversĂ©s, abrĂ©gĂ© MinIP pour *[minimum intensity projection](https://en.wikipedia.org/wiki/Minimum_intensity_projection)* ; * somme des valeurs traversĂ©es ; * intĂ©grale des valeurs traversĂ©es ; * etc. Dans cet exemple nous allons utiliser la valeur maximale grĂące au filtre *vtkFixedPointVolumeRayCastMapper*. Voici notre pipeline :  Elle commence par *reader* qui ne prend rien en entrĂ©e mais agit sur le systĂšme en lisant le fichier, puis on utilise un *VolumeRayCastMapper* qui va se charger de faire le lancer de rayon et le calcul *MIP*. On le passe ensuite Ă lâobjet *vtkVolume* qui est le pendant volumique du *vtkActor* utilisĂ© pour les primitives gĂ©omĂ©triques. Le rĂ©sultat :  Ăa y est on commence Ă voir lâintĂ©rieur et lâextĂ©rieur. La couleur dâun pixel est donc la valeur maximale du matĂ©riau traversĂ©, en gros le matĂ©riau le plus dense (les os et les dents dans notre cas). Mais il est encore difficile de situer chacun des Ă©lĂ©ments dans lâespace, ce qui est lâinconvĂ©nient majeur de la mĂ©thode *MIP*. On peut contourner ce problĂšme en crĂ©ant une animation :  Il est ensuite possible de colorer les diffĂ©rents pixels grĂące Ă une fonction qui va associer chaque valeur Ă une couleur, appelĂ©e *fonction de transfert*. Si on connaĂźt la plage de valeur de chaque Ă©lĂ©ment Ă faire ressortir, on peut lui associer des couleurs similaires. Ici les dents en rouge, les os en jaune et la peau en bleu :  ## Autres types de rendu Ces exemples simples ont permis de dĂ©couvrir toute la souplesse et la puissance de lâarchitecture en *pipeline* de VTK. Il existe de nombreux autres filtres qui rĂ©pondent aux besoins de la visualisation de donnĂ©es scientifiques. Citons les grandes catĂ©gories : * la coloration, câest-Ă -dire associer une plage de valeur Ă un ensemble de couleurs :  * crĂ©ation de contours (lignes, surface...)  * affichage de symboles (*glyphs*)  * affichage de lignes de courant (*streamlines*)  * dĂ©coupage de volume  * dĂ©formation de maillages  * travail sur des images  * rendu volumique  * rendu gĂ©ographique * affichage de graphes * analyse de donnĂ©es (*Big Data*) * ... Et, sâil vous manque des outils, le code ouvert et lâarchitecture modulaire de VTK permettent de les dĂ©velopper, soit vous-mĂȘme, soit via un prestataire tel que [Kitware](https://www.kitware.eu/what-we-offer/). Vous pouvez aussi en discuter sur le [forum de VTK](https://discourse.vtk.org/) ou encore participer directement au dĂ©veloppement (rapport de bug, discussion, proposition de nouvelle fonctionnalitĂ©...) sur l'[instance gitlab](https://gitlab.kitware.com/vtk/vtk) dĂ©diĂ©e. # Conclusion VTK est donc une boĂźte Ă outils trĂšs puissante dĂ©diĂ©e Ă la visualisation de donnĂ©es. Cette prĂ©sentation nâa fait quâeffleurer les fonctionnalitĂ©s de base pour illustrer lâutilisation du *pipeline*, et je vous encourage Ă aller consulter les [exemples](https://kitware.github.io/vtk-examples/site/Cxx/) pour un panorama plus complet. Pour finir, si vous ne dĂ©veloppez pas des applications de visualisation scientifique, il se peut quâassocier les filtres Ă la main via un langage de programmation vous paraisse assez laborieux. Câest pour cela que Kitware a dĂ©veloppĂ© une application qui sâappuie sur VTK et permet de manipuler trĂšs facilement le *pipeline* : [Paraview](https://www.paraview.org/). Mais ce sera pour une prochaine dĂ©pĂȘche !