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

03 julio, 2013

Utilizar imágenes MHD/RAW en Matlab

Retomando algo que había escrito previamente, dejo un par de líneas que ayudan en la lectura y escritura de imágenes MetaImage en Matlab:

NOTA: Solo muestro cómo leer, pero es equivalente para escribir la imagen.

Cargar imagen MHD en Matlab

fid = fopen(‘NOMBRE_ARCHIVO.raw’);
A = fread(fid,dimx * dimy * dimz, ‘uint16’); %aplica este formato para unsigned short
img = reshape(A,dimx,dimy,dimz); %aqui se convierte en matriz pues cuando lee, lo que guarda en A es un vector.

En Imagenes MHD…

case ‘MET_UCHAR’
    type = ‘uint8’;
case ‘MET_CHAR’
    type = ‘int8’;
case ‘MET_USHORT’
    type = ‘uint16’;
case ‘MET_SHORT’
    type = ‘int16’;
case ‘MET_UINT’
    type = ‘uint32’;
case ‘MET_INT’
    type = ‘int32’;
case ‘MET_FLOAT’
    type = ‘single’;
case ‘MET_DOUBLE’
    type = ‘double’;

22 mayo, 2013

Utilizando Git, TortoiseGit y llave SSH en Windows

Luego de unas pruebas que en el inicio parecían sencillas para lograr acceder a un repositorio Git instalado remotamente al cual tengo acceso por medio de claves SSH, llegué a un resultado satisfactorio que -lo admito con algo de alegría- cada vez se parece más al manejo en Linux. Pero bueno, prefiero por explicar un poco comentando primero mi problema. La situación era la siguiente:

Tenía ya instalado TortoiseGit-1.8.3.0 64 bits, Git-1.8.1.2 (al cual le había asignado como cliente SSH a Tortoise) y Putty-0.62 en mi PC, Windows 7. Normalmente el acceso al servidor remoto CVS tan solo necesitaba la instalación de TortoiseCVS y el mismo podía reconocer la versión instalada de Putty para conectarse por SSH al servidor (habiendo cargado previamente la llave con extensión .ppk que se genera con la llave pública y privada) y realizar la identificación del usuario. Todo era de cierta forma transparente. Sin embargo, con TortoiseGit, un cliente adicional de Putty aparece en el juego y además hay un supuesto TortoiseGitPlink que da ciertos problemas como el que me sucedía a mi. Al momento de hacer un git push o un git clone o cualquier cosa que involucrara el servidor aparecía el problema siguiente:

TortoiseGitPLink Fatal Error
Disconnected: No supported authentication methods available (server sent: publickey, gssapi-keyex, gssapi-with-mic)


Solución: Luego de una serie de desinstalaciones e instalaciones seguidas, encontré la instalación que no tiene problemas para obtener un buen espacio de trabajo para Git en Windows usando dichas claves SSH. Voici les étapes! Basado en: http://boredwookie.net/index.php/blog/git-part-2-get-tortoisegit-working-on-windows/

1- Descargar TortoiseGit-1.8.3.0-64bit.msi y Git-1.8.1.2-preview20130201.exe
2- Instalar TortoiseGit normalmente.
3- Ejecutar el instalador de Git. Seleccionar las opciones de ‘Use Git Bash Only’ y de ‘Use OpenSSH’. La segunda viene siendo bien importante.
4- Colocar la llave SSH (id_rsa) en la carpeta .ssh que debería estar localizada en el directorio del usuario, e.g. C:\Users\myUser.ssh\id_rsa (la carpeta .ssh puede ser facilmente creada por línea de comandos lanzando un mkdir .ssh)
5- En la configuración de TortoiseGit, ir a Network, y asignar como ‘SSH Client’: C:\Program Files (x86)\Git\bin\ssh.exe
6- Intenta un clone o un push o cualquier cosa que tenga acceso al servidor. Va a preguntarte tu contraseña de la llave SSH y … now it works!

Nota: Otras posibilidades para acceder a Git son:
- La consola de comandos ‘Git bash’ instalada con Git
- Con Eclipse (personalmente me gusta esta): Import, ’Projects from Git’, URI. Es importante confirmar en Window -> Preferences -> General -> Network Connections -> SSH2 que el cliente SSH está accediendo sin problema a las llaves disponibles en el sistema.

Enjoy it !!

RaC

22 abril, 2013

Linux - Recuperar USB utilizada como disco de arranque

Como de costumbre, todas las complejas cuestiones técnicas tienen una solución relativamente directa en Linux. El problema es saber todos los trucos y encontrarlos rápidamente para poder sacarles provecho. Un ejemplo de esta situación es poder recuperar una USB que había sido utilizada como boot drive para hacer una instalación alguna distribución de Linux. Pensando que ya no tenía caso y que iba a ser complicado encontrar la solución para volver a utilizar toda la memoria del disco, encontré la página con las respuestas que solamente alguien muy técnico (geek guys :D) puede encontrar tan solo con la ayuda de los comandos (verhttp://www.pendrivelinux.com/restoring-your-usb-key-partition). A continuación reescribo los mismos pasos que acabo de probar y que me dieron un resultado positivo:

A. Primero se deben borrar las particiones que quedan en la USB

1. Abrir terminal y entrar como superusuario (escribir su)
2. Revisar los nombres de los discos y sus particiones: fdisk -l
3. Entrar a la revisión del disco: fdisk /dev/sdX (reemplazando X por el nombre del disco. en caso USB, normalmente sdb)
4- Escribir d y proceder a borrar las particiones (en mi caso habían 3: sdb1, sdb2, sdb3)
5- Escribir 1 para borrar la primera partición. Borrar las otras dos.

B. Crear nueva partición

1- Escribir n para crear la partición
2- Escribir p para hacer una partición primaria
3- Escribir 1 para indicar que es la primera partición y aceptar el tamaño por default.
4- Luego pregunta el espacio de la segunda partición, asignarlo por default (el resto de espacio del disco)
5- Escribir w para escribir la info de la nueva partición a la USB
6- Desmontar el disco con: umount /dev/sdX1 (reemplazando X por el nombre del disco. en caso USB, normalmente sdb)

C. Asignar la partición a formato FAT

1- Escribir mkfs.vfat -F32 /dev/sdX1 (reemplazando X por el nombre del disco. en caso USB, normalmente sdb)

Al extraer la memoria y volverla a utilizar en el sistema, todo la memoria (aparentemente) estará disponible. Memoria recuperada !