Esta página es para la versión anterior. La página correspondiente en inglés se eliminó en la versión actual.

Explorando rebanadas de un conjunto de datos tridimensional de MRI

En este ejemplo se muestra cómo explorar un volumen de datos mediante la extracción de segmentos a través de un conjunto de datos de IRM tridimensional mediante funciones imtransform y tformarray.

Paso 1: Cargar y ver MRI horizontal

Este ejemplo utiliza el conjunto de datos de MRI que viene con MATLAB ® y que se utiliza en los ejemplos de ayuda para montage y immovie. Al cargar mri.mat se agregan dos variables al espacio de trabajo: D (128-by-128-by-1-by-27, Class Uint8) y una escala de grises colores, map (89-por-3, clase doble).

D abarca 27 128-por-128 rebanadas horizontales de una exploración de los datos de MRI de un cráneo humano. Los valores en D varían entre 0 y 88, por lo que el colores es necesario para generar una figura con un rango visual útil. La dimensionalidad de D lo hace compatible con montage. Las dos primeras dimensiones son espaciales. La tercera dimensión es la dimensión de color, con el tamaño 1 porque indexa en el mapa de color. (size(D,3) sería 3 para una secuencia de imagen RGB.) La cuarta dimensión es temporal (como ocurre con cualquier secuencia de imágenes), pero en este caso particular también es espacial. Así que hay tres dimensiones espaciales en D y podemos usar imtransform o tformarray para convertir las rebanadas horizontales a rodajas sagitales (mostrando la vista desde el lado de la cabeza) o las rebanadas coronales (frontales) (mostrando la vista desde el frente o la parte posterior de la cabeza).

Las dimensiones espaciales de D se ordenan como sigue:

  • Dimensión 1: Frente a la parte posterior de la cabeza (rostral/anterior a caudal/posterior)

  • Dimensión 2: De izquierda a derecha de la cabeza

  • Dimensión 4: De abajo hacia arriba de la cabeza (inferior a superior).

Un factor importante es que los intervalos de muestreo no son los mismos a lo largo de las tres dimensiones: las muestras a lo largo de la dimensión vertical (4) se espacian 2,5 veces más ampliamente que a lo largo de las dimensiones horizontales.

Cargue el conjunto de datos de MRI y vea las 27 rebanadas horizontales como un montaje.

load mri; montage(D,map) title('Horizontal Slices');

Paso 2: Extraer la rebanada sagital de las rodajas horizontales mediante imtransforma

Podemos construir una rebanada sagital media de los datos de MRI tomando un subconjunto de D y la transformando para explicar los diversos intervalos de muestreo y la orientación espacial de las dimensiones de D.

La siguiente instrucción extrae todos los datos necesarios para una rebanada sagital.

M1 = D(:,64,:,:); size(M1)
ans = 1×4

   128     1     1    27

Sin embargo, no podemos ver M1 como una imagen porque es 128-por-1-por-1-por-27. reshape (o squeeze) puede convertir M1 en una imagen 128-by-27 que es visible con imshow.

M2 = reshape(M1,[128 27]); size(M2)
ans = 1×2

   128    27

figure, imshow(M2,map); title('Sagittal - Raw Data');

Las dimensiones en M2 se ordenan de la siguiente manera:

  • Dimensión 1: Frente a la parte posterior de la cabeza (rostral a caudal)

  • Dimensión 2: De abajo hacia arriba de la cabeza (inferior a superior).

Podemos obtener una visión mucho más satisfactoria al transformar M2 para cambiar su orientación y aumentar el muestreo a lo largo de la dimensión vertical (inferior-superior) por un factor de 2,5--haciendo que el intervalo de muestreo sea igual en las tres dimensiones espaciales. Podríamos hacer esto en pasos comenzando con una transpuesta, pero la siguiente transformación afín permite una transformación de un solo paso y un uso más económico de la memoria.

T0 = maketform('affine',[0 -2.5; 1 0; 0 0]);

El bloque superior 2 por 2 de la matriz pasada a maketform, [0 -2.5;1 0], combina la rotación y el escalamiento. Después de la transformación tenemos:

  • Dimensión 1: De arriba a abajo de la cabeza (superior a inferior).

  • Dimensión 2: Frente a la parte posterior de la cabeza (rostral a caudal)

La llamada

intransform (m2, T0, ' cúbicos ')

sería suficiente para aplicar T a M2 y proporcionar una buena resolución, mientras que la interpolación a lo largo de la dirección de arriba a abajo. Sin embargo, no hay necesidad de interpolación cúbica en la dirección de adelante hacia atrás, ya que no se producirá ningún remuestreo a lo largo de la dimensión (salida) 2. Por lo tanto, especificamos el remuestreo de vecino más cercano en esta dimensión, con mayor eficiencia y resultados idénticos.

R2 = makeresampler({'cubic','nearest'},'fill'); M3 = imtransform(M2,T0,R2);   figure, imshow(M3,map); title('Sagittal - IMTRANSFORM')

Paso 3: Extraer la rebanada sagital de las rodajas horizontales utilizando TFORMARRAY

En este paso obtenemos el mismo resultado que el paso 2, pero usamos tformarray para pasar de tres dimensiones espaciales a dos en una sola operación. El paso 2 comienza con una matriz que tiene tres dimensiones espaciales y termina con una matriz que tiene dos dimensiones espaciales, pero las imágenes bidimensionales intermedias (M1 y M2) allanan el camino para la llamada a imtransform que crea M3. Estas imágenes intermedias no son necesarias si usamos tformarray en lugar de imtransform. imtransform es muy conveniente para 2-d a las transformaciones 2-d, pero tformarray apoya n-d a las transformaciones m-d, donde m no necesita igualar n.

A través de su argumento TDIMS_A, tformarray nos permite definir una permutación para la matriz de entrada. Ya que queremos crear una imagen con:

  • Dimensión 1: Superior a inferior (dimensión original 4, invertido)

  • Dimensión 2: Caudal a rostral (dimensión original 1)

y extraer un solo plano sagital a través de la dimensión original 2, especificamos tdims_a = [4 1 2]. Creamos un tform a través de la composición comenzando con una transformación de 2-D afín T1 que escala la (nueva) dimensión 1 por un factor de-2,5 y agrega un cambio de 68,5 para mantener las coordenadas de la matriz positivas. La segunda parte del composite es una transformación personalizada T2 que extrae el plano sagital 64TH utilizando un INVERSE_FCN muy simple.

T1 = maketform('affine',[-2.5 0; 0 1; 68.5 0]);   inverseFcn = @(X,t) [X repmat(t.tdata,[size(X,1) 1])]; T2 = maketform('custom',3,2,[],inverseFcn,64); Tc = maketform('composite',T1,T2);

Tenga en cuenta que T2 y Tc toman una entrada 3D en una entrada de 2-d.

Usamos el mismo enfoque para remuestrear como antes, pero incluimos una tercera dimensión.

R3 = makeresampler({'cubic','nearest','nearest'},'fill');

tformarray transforma las tres dimensiones espaciales de D en una salida 2-D en un solo paso. Nuestra imagen de la salida es 66-by-128, con los 27 planos originales que se expanden a 66 en la dirección vertical (inferior-superior).

M4 = tformarray(D,Tc,R3,[4 1 2],[1 2],[66 128],[],0);

El resultado es idéntico a la salida anterior de imtransform.

figure, imshow(M4,map); title('Sagittal - TFORMARRAY');

Paso 4: Creación y visualización de rodajas sagital

Creamos un array de 4-D (la tercera dimensión es la dimensión de color) que puede ser usada para generar una secuencia de imagen que va de izquierda a derecha, inicia 30 planos en, salta cada otro plano, y tiene 35 fotogramas en total. La matriz transformada tiene:

  • Dimensión 1: De arriba a abajo (superior a inferior)

  • Dimensión 2: De frente hacia atrás (rostral a caudal)

  • Dimensión 4: De izquierda a derecha.

Como en el paso anterior, permutamos la matriz de entrada usando TDIMS_A = [4 1 2], de nuevo volteando y reescalando/remuestreando la dimensión vertical. Nuestra transformación afín es la misma que la T1 anterior, excepto que añadimos una tercera dimensión con un elemento (3, 3) de 0,5 y (4, 3) elemento de-14 elegido para mapear 30, 32,... 98 a 1, 2,..., 35. Esto centra nuestros 35 marcos en la rebanada sagital media.

T3 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 0.5; 68.5 0 -14]);

En nuestra llamada a tformarray, TSIZE_B = [66 128 35] ahora incluye los marcos 35 en la 4ª dimensión de izquierda a derecha (que es la tercera dimensión de transformación). El remuestreador sigue siendo el mismo.

S = tformarray(D,T3,R3,[4 1 2],[1 2 4],[66 128 35],[],0);

Ver las rebanadas sagitales como un montaje (acolchar ligeramente la matriz para separar los elementos del montaje).

S2 = padarray(S,[6 0 0 0],0,'both'); figure, montage(S2,map) title('Sagittal Slices');

Paso 5: Crear y Mostrar divisiones coronales

La construcción de rodajas coronales es casi la misma que la construcción de rodajas sagital. Cambiamos TDIMS_A de [4 1 2] a [4 2 1]. Creamos una serie de 45 Marcos, comenzando 8 planos en y moviendo de atrás al frente, saltando cada otro marco. Las dimensiones de la matriz de salida se ordenan de la siguiente manera:

  • Dimensión 1: De arriba a abajo (superior a inferior)

  • Dimensión 2: De izquierda a derecha

  • Dimensión 4: De vuelta al frente (caudal a rostral).

T4 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 -0.5; 68.5 0 61]);

En nuestra llamada a tformarray, TSIZE_B = [66 128 48] especifica las cotas verticales, de lado a lado y de adelante a atrás, respectivamente. El remuestreador sigue siendo el mismo.

C = tformarray(D,T4,R3,[4 2 1],[1 2 4],[66 128 45],[],0);

Tenga en cuenta que todas las permutaciones y volteaciones de matrices en los pasos 3, 4 y 5 se han administrado como parte de la operación tformarray.

Ver las rebanadas coronales como un montaje (acolchar ligeramente la matriz para separar los elementos del montaje).

C2 = padarray(C,[6 0 0 0],0,'both'); figure, montage(C2,map) title('Coronal Slices');