Mostrando las entradas con la etiqueta vtk. Mostrar todas las entradas
Mostrando las entradas con la etiqueta vtk. Mostrar todas las entradas

04 septiembre, 2014

Herramientas para desarrollar en 3D Slicer


Todo un desafío !! Lograr adivinar el mejor ambiente de desarrollo para poder avanzar de forma adecuada en un proyecto es toda una tarea de días de lectura e intentos. Sin embargo, no hay nada como poder tener un proyecto bien configurado con herramientas que permitan avanzar rápidamente en el desarrollo gracias al autocomplete o a simples vistas de clases y métodos adicionales. Además, siempre es ideal y es bastante útil tener una herramienta para depurar el código y saber qué sucede en ejecución. Todo esto es aun más requerido en Linux para quienes no somos los más expertos y más amigos de trabajar todo en consola.

Es por eso que luego de hacer intentos progresivos y de leer varias formas para llevar a cabo esta configuración adecuadamente en el desarrollo de nuevas extensiones o módulos para 3D Slicer (o simplemente Slicer), quiero detallar mi configuración con el proyecto ejemplo que generé en el tutorial mismo de esta herramienta para Loadable modules.

Antes que nada quiero decir que soy un seguidor sin medida de los desarrollos de Kitware. Slicer, VTK, ITK, CMake, ParaView, Kiwi, .... Sin embargo, siempre que quiero ir a los detalles y quizas contribuir al código, me cuesta bastante entender todo lo que hay por dentro. Quizas es más sencillo con alguien con más experiencia al lado guiándolo, pero esta comunidad no está tan expandida aún entre los grupos de tratamiento de señales y es difícil encontrar las personas motivadas para tener ese tipo de colaboración. Pocas veces he logrado configurar y servirme de un Depurador con estas herramientas. Aun así, creo que es ideal para entender el código mucho más rápido y entender a qué se tiene acceso en cada punto del código. Recomiendo ampliamente realizar esta configuración antes de empezar a hacer desarrollos puntuales.

Detalles de mi máquina y prerequisitos 


  - SO: Ubuntu 14.04
  - Para compilar Slicer 4, seguí las indicaciones disponibles en la página. Para esto se requiere compilar e instalar cmake 2.8 y qt 4.8.6. Al final se podrá ejecutar Slicer desde la carpeta SLICER_BUILD_PATH/Slicer-build/Slicer

22 julio, 2013

Asignar/mapear valores provenientes de una imagen 3D sobre una iso-surface con ParaView

Existen diversas técnicas para visualizar el contenido de una imagen 3D (el volumen conformado luego de la compilación de imágenes 2D e.g. imágenes diagnósticas médicas de tomografía o resonancia magnética). Generalmente se utilizan técnicas de renderizado volumétrico que permiten ver el interior de la estructura con alguna tabla de colores o con algunos métodos alternativos de umbralización; ejemplos de estos dos Volume Rendering (VR) y Maximum Intesity Projections (MIP). Sin embargo, algunos análisis requieren una visualización clara de los valores obtenidos a lo largo de una superficie definida o extraída previamente. La situación siguiente describe una necesidad recurrente que es la razón principal de este post:

- Se tiene una imagen 3D donde el valor de cada voxel entra en un rango que puede ser representado por una escala de grises (normalmente una imagen de tomografía, resonancia, ultrasonido, etc.). También se tiene una máscara de segmentación (imagen binaria que asigna un valor diferente de cero a una región de la imagen que se quiere estudiar; cero al resto de la imagen) del mismo tamaño de la imagen original. Para el análisis de la zona definida por la máscara de segmentación se quieren visualizar los valores en la imagen original sobre la superficie de la segmentación. En otras palabras, “mapear” los valores originales en la superficie segmentada.

Como ya está mencionado en el título, Paraview me sorprende una vez más permitiendo hacer todo esto de una manera muy sencilla y rápida. De aquí en adelante mi guía para resolver este problema utilizando Paraview:

Datos de entrada:
Imagen original en formato MHD/MetaImage (en mi caso el tipo de dato es unsigned short, pero puede ser cualquiera) . 
Imagen binaria de la segmentación en formato MHD.

19 julio, 2013

Paso a paso: desde malla STL hasta sólido IGS/IGES usando herramientas libres u open-source

Todo un misterio, muchas pruebas y un enorme trabajo para lograr el resultado final. Primero voy a resumir las aplicaciones y lenguajes libres que utilizo, luego describiré mi problema y finalmente hablaré de mi solución.

Aplicaciones:


- ParaView: herramienta para visualización en 3D. Util para cortar mallas (y ver su interior), para conversión de datos entre VTK-STL-PLY, práctico para obtener rápidamente la iso-surface de una imagen binaria, sencillo al momento de medir distancias o poner nuevos puntos.

- MeshLab: herramienta para el tratamiento de mallas. Util para la conversión de datos PLY-STL, práctico para lanzar algoritmos sobre mallas e.g. smooth, decimation, invertir normales, etc. Tiene una interfaz simple para identificar y llenar huecos en las mallas. Puede utilizarse para el análisis de las propiedades de las mallas : self-intersect faces, manifold edges, duplicated vertices, etc.

- MeVisLab: herramienta de prototipado rápido para visualización y tratamiento de imágenes, especialmente enfocado en imágenes médicas. Util para toda prueba rápida de algoritmos de procesamiento de imágenes. Arquitectura orientada a eventos con respuesta inmediata ante los cambios en los parámetros de los filtros.

- FreeCAD: herramienta CAD open-source para el modelado en 3D. No tengo mucha experiencia en su utilización, pero en este proyecto es muy práctico para la conversión de una malla de triángulos a un formato de solidos (IGS/IGES). También tiene una interfaz de análisis de las propiedades de las mallas que permite modificar y reparar problemas en el mallado.

- Blender: herramienta para el modelado libre de objetos en 3D. Util para pasar filtros sobre las mallas, e.g. decimation, smooth, binary operations, entre otros. Util para la edición por puntos, aristas o caras de una superficie. Se puede utilizar para leer y convertir archivos STL y PLY.

- VTK: lenguaje open-source para visualización de datos. En este caso utilizo el código comentado previamente en este blog para la rasterización de una malla en una imagen binaria. El código lo ejecuto en Linux con la versión de VTK 5.6

- vtkSurface-DiscreteRemeshing: código bajo licencia CeCILL B desarrollado en el laboratorio CREATIS por Sebastien Valette. Permite una regeneración correcta de una superficie con una cantidad definida de elementos. Conserva la topología de la malla con las mejores propiedades de la misma. Para más información ver el artículo:
" Approximated Centroidal Voronoi Diagrams for Uniform Polygonal Mesh Coarsening", Valette & Chassery, Eurographics 2004

27 marzo, 2013

Mallas a Imágenes + Operaciones lógicas

Como luego no me voy a acordar de la secuencia de pasos que acabo de hacer, prefiero escribirlo para próximas oportunidades.

Problema:

- Recibo dos mallas en formato STL: la superficie de una esfera que se superpone con otra. Se quiere generar la diferencia entre la más grande respecto a la más pequeña.

Solución:

- Rasterizar las superficies. Utilizo VTK, vtkPolyDataToImageStencil (ver código de ejemplo). Defino el spacing de la imagen resultante. El tamaño es definido automaticamente por los bounds del polydata. Se generan dos imágenes MHD de suficiente resolución para generar nuevamente las mallas.

- Aplicar aritmética binaria entre las dos imágenes para generar la diferencia. Para esto uso MeVisLab. Tan solo con el filtro MergeRegions, opción AbsoluteDifference, obtengo el resultado. En Use Region: Union of all regions. El resultado genera unos bordes indeseables, por lo que se aplica un Opening de kernel 2x2x2. Guardo las nuevas imágenes.

- Generar malla de la diferencia. Abriendo la malla en ParaView, genero la superficie (MarchingCubes) y la guardo como archivo PLY. Esta malla es escalonada (por el MarchingCubes) y puede tener huecos. Abro el archivo en MeshLab y aplico una operación de llenado de huecos. Guardo nuevamente en PLY, abro este resultado en ParaView y guardo esa superficie completa como polydata en formato VTK.

- Reducir el tamaño de la malla/mejorar la distibución de triángulos y suavizar. Utilizo desde un pipeline en bbtk (CreaTools) el algoritmo de S.Valette; en paticular la caja MeshCleaning. Esta caja genera un Polydata que puede ser guardado en formato VTK o STL. (ParaView también funciona para hacer conversiones a STL)

Et voilà mon petit tout sur les différents outils de traitement d’images et des maillages !!! El resultado es más bien interesante y cool! Indeed, no son propiamente esferas ;-)


En azul la parte que quería guardar en un STL independiente. La roja era una de las mallas de entrada y la suma de los dos era la otra.

14 marzo, 2013

Java + VTK - 1er Test

Primera prueba de Java + VTK!

Seguí en detalle la guía disponible en este sitio Web: http://www.particleincell.com/2011/vtk-java-visualization/ . A pesar que todo funcionó prefiero hacer anotaciones aun más precisas de mi prueba para que pueda reproducirse sin problema:

1- Descargué el VTK 5.10.1 . Generé el proyecto con CMake 2.8.9 y el CMakeCache.txt está disponible en los archivos adjuntos. Aquí se puede ver que forcé la dependencia a una de las versiones instaladas en mi máquina, específicamente la de Java 7 32bits. (C:/Program Files (x86)/Java/jdk1.7.0_15)

2- La compilación la realicé con VC++ Express 2008. No hubo problemas de compilación y luego de instalar se agregaron las rutas indicadas al PATH: C:\Program Files (x86)\VTK\bin;C:\Program Files (x86)\Java\jdk1.7.0_15\lib; C:\Program Files (x86)\Java\jre7\bin; C:\Program Files (x86)\Java\jre7\bin\client; C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT;

3- Al crear el proyecto Eclipse asigné el mismo JDK como JVM que utiliza el proyecto. Añadí también el vtk.jar. Aparecieron los problemas de “vtkCommonJava not loaded”, pero se resolvieron finalmente añadiendo como Native Libraries de vtk.jar la ruta: C:\Program Files (x86)\VTK\bin donde están todos los DLL’s.

4- El ejemplo de los IsoSurfaces y los planos funciona :D. Haré una prueba con imágenes para ver cómo se comporta en dichos casos Java con VTK.


Voila mi primer Test!


RaC

27 febrero, 2013

Motor de Rendering - VTK

Tomado del webinar de Kitware de VTK, agrego la siguiente imagen que me parece vital para entender la conexión entre los objetos que hacen parte de las escenas VTK:


Tomado de http://www.vtk.org/VTK/resources/webinars.html


Esta es la mejor manera de explicar y entender las conexiones necesarias en VTK !! (este mismo diagrama lo hice en repetidas ocasiones hace unos años)