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.



Pasos a seguir


- Abrir la imagen original y la imagen segmentada en Paraview (i.e. abrir el archivo MHD). Ya estando abiertas Paraview visualizar el resultado con técnicas clásicas como VR, o extraer una iso-surface. Ver por ejemplo la siguiente imagen.


Izquierda: Volume rendering de una imagen de tomografía (aneurisma en arteria cerebral). Derecha: Iso-surface de la segmentación del aneurisma (naranja) y de la arteria (azul)

- Dar click sobre la imagen original en el Pipeline Browser. Luego, agregar un Programmable Filter (Filters / Data Analysis / Programmable Filter).

- En las propiedades del filtro verificar que: Output Data Set Type, Same as Input. Agregar el siguiente Script de VTK en Python:

input = self.GetInputDataObject(0,0)
output = self.GetOutputDataObject(0)
output.ShallowCopy(input)
output.GetPointData().GetScalars().SetName(“OriginalValues”)



Este script permite cambiar el nombre del arreglo de datos de la imagen. Este es asignado por defecto y para las imágenes MHD siempre se inicializa con el mismo nombre: MetaImage. Esto se puede verificar en la vista Information / Data Arrays.

- En el Pipeline Browser seleccionar el Programmable Filter Y la máscara de segmentación (se pueden seleccionar dos objetos a la vez usando la tecla Ctrl). Luego, utilizar el filtro Append Attributes (Filters / Alphabetical / Append Attributes). En el ultimo objeto del Pipeline Browser que fue generado por el Append Attributes, se puede verificar que ahora tenemos un mismo objeto con el arreglo de datos de la segmentación y el arreglo de datos de la imagen original (verificar en la vista Information / Data Arrays).

- Teniendo seleccionado este ultimo resultado, añadir el filtro Contour (Filters / Alphabetical / Contour equivalente a la extracción de una Iso-surface). En las propiedades de este filtro, seleccionar en Contour By el arreglo de datos de la segmentación, es decir MetaImage.

- Finalmente en la vista Display podemos asignar una tabla de colores definida por el rango de valores de la imagen original. Para esto asignar en Color By: OriginalValues. La tabla de colores puede ser modificada en cualquier momento al hacer click en Edit Color Map…


Superficie de la segmentación de la arteria con los valores de la imagen original sobre la superficie. En la parte superior se ve la zona en rojo donde está ubicado el aneurisma. Se puede hacer un análisis de la validez de la segmentación (sobre-segmentado o sub-segmentado) a lo largo de la arteria.

It’s done!! Podemos visualizar los valores de la imagen original sobre una superficie previamente generada. Solución muy práctica y sencilla con ParaView. Enjoy it ! :-)

No hay comentarios.:

Publicar un comentario