Main Content

Explorar los sectores de un conjunto de datos de RMN de 3 dimensiones

En este ejemplo se muestra cómo explorar un volumen de datos mediante la extracción de sectores a través de un conjunto de datos de RMN tridimensional mediante funciones y uso.imtransformtformarray

Paso 1: Cargue y vea la RMN horizontal

En este ejemplo se utiliza el conjunto de datos MRI que viene con MATLAB® y que se utiliza en los ejemplos de ayuda para ambos y .montageimmovie La carga agrega dos variables al espacio de trabajo:mri.mat (128-by-128-by-1-by-27, clase uint8) y un mapa de colores en escala de grises, (89-by-3, clase doble).Dmap

comprende 27 rebanadas horizontales de 128 por 128 de una resonancia magnética de un cráneo humano.D Los valores en rango de 0 a 88, por lo que el mapa de colores es necesario para generar una figura con un rango visual útil.D La dimensionalidad de lo hace compatible con .Dmontage Las dos primeras dimensiones son espaciales. La tercera dimensión es la dimensión de color, con el tamaño 1 porque se indexa en el mapa de colores. ( sería 3 para una secuencia de imágenes RGB.)size(D,3) La cuarta dimensión es temporal (como con cualquier secuencia de imágenes), pero en este caso concreto también es espacial. Así que hay tres dimensiones espaciales en y podemos usar o convertir las rodajas horizontales en rodajas sagitales (mostrando la vista desde el lado de la cabeza) o rebanadas coronales (frontales) (mostrando la vista desde la parte delantera o posterior de la cabeza).Dimtransformtformarray

Las dimensiones espaciales de se ordenan de la siguiente manera:D

  • Dimensión 1: De adelante 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 a 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) están espaciadas 2,5 veces más ampliamente que a lo largo de las dimensiones horizontales.

Cargue el conjunto de datos de RMN y vea los 27 sectores horizontales como un montaje.

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

Paso 2: Extraer sagital de rodajas horizontales usando IMTRANSFORM

Podemos construir un segmento de mid-sagital a partir de los datos de RMN tomando un subconjunto de y transformándolo para tener en cuenta los diferentes intervalos de muestreo y la orientación espacial de las dimensiones de .DD

La siguiente instrucción extrae todos los datos necesarios para un sector midsagittal.

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

   128     1     1    27

Sin embargo, no podemos ver como una imagen porque es 128-por-1-por-1-por-27. (o ) puede convertir en una imagen de 128 por 27 que se puede ver con .M1reshapesqueezeM1imshow

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

   128    27

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

Las dimensiones en se ordenan de la siguiente manera:M2

  • Dimensión 1: De adelante a detrás de la cabeza (rostral a caudal)

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

Podemos obtener una visión mucho más satisfactoria transformando 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.M2 Podríamos hacerlo en pasos que comienzan con una transposición, 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, , combina la rotación y la escala.[0 -2.5;1 0] Después de la transformación tenemos:

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

  • Dimensión 2: De adelante a detrás de la cabeza (rostral a caudal)

La llamada

imtransform(M2,T0,'cubic')

sería suficiente para aplicar y proporcionar una buena resolución mientras se interpola a lo largo de la dirección de arriba a abajo.TM2 Sin embargo, no hay necesidad de interpolación cúbica en la dirección frontal a posterior, ya que no se producirá ningún remuestreo a lo largo de la dimensión 2 (salida). 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 sagital slice de los cortes horizontales usando TFORMARRAY

En este paso obtenemos el mismo resultado que el paso 2, pero se utiliza para pasar de tres dimensiones espaciales a dos en una sola operación.tformarray 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 ( y ) allanan el camino para la llamada a que crea .M1M2imtransformM3 Estas imágenes intermedias no son necesarias si usamos en lugar de . es muy conveniente para transformaciones 2-D a 2-D, pero admite transformaciones N-D a M-D, donde M no necesita ser igual a N.tformarrayimtransformimtransformtformarray

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

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

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

y extraemos un solo plano sagital a través de la dimensión original 2, especificamos [4 1 2].tdims_a Creamos una composición via a partir de una transformación afín 2D que escala la (nueva) dimensión 1 por un factor de -2.5 y agrega un desplazamiento de 68.5 para mantener las coordenadas de la matriz positivas.tformT1 La segunda parte del compuesto es una transformación personalizada que extrae el plano sagital 64 utilizando un plano muy simple.T2INVERSE_FCN

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 y tomar una entrada 3D a una entrada 2D.T2Tc

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

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

transforma las tres dimensiones espaciales de una salida 2D en un solo paso.tformarrayD Nuestra imagen de salida es 66 por 128, con los 27 planos originales expandiéndose 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: Crear y mostrar sagital sectores

Creamos una matriz 4D (la tercera dimensión es la dimensión de color) que se puede utilizar para generar una secuencia de imágenes que va de izquierda a derecha, inicia 30 planos, se 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 adelante hacia atrás (rostral a caudal)

  • Dimensión 4: De izquierda a derecha.

Como en el paso anterior, permutamos la matriz de entrada usando , de nuevo volteando y reescalando/remuestreando la dimensión vertical.TDIMS_A = [4 1 2] 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 cuadros en la rebanada mid-sagittal.

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

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

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

Ver las rodajas sagital como un montaje (rellenar 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 rebanadas coronales

Construir rodajas coronales es casi lo mismo que construir rodajas sagitales. Cambiamos de a .TDIMS_A[4 1 2][4 2 1] Creamos una serie de 45 cuadros, comenzando 8 planos y moviéndose de atrás hacia adelante, saltando todos los demás fotogramas. 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 , [66 128 48] especifica las dimensiones vertical, de lado a lado y de adelante hacia atrás, respectivamente.tformarrayTSIZE_B 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 volteos de matriz en los pasos 3, 4 y 5 se manejaron como parte de la operación.tformarray

Ver las rebanadas coronales como un montaje (rellenar 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');