이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

3차원 MRI 데이터 세트의 단층 탐색하기

이 예제에서는 imtransform 함수와 tformarray 함수를 사용하여 3차원 MRI 데이터 세트에서 단층을 추출하는 방식으로 데이터 볼륨을 탐색하는 방법을 보여줍니다.

1단계: 가로 방향의 MRI를 불러온 후 확인하기

이 예제에서는 MATLAB®과 함께 제공되고 montageimmovie에 대한 도움말 예제에도 사용되는 MRI 데이터 세트를 사용합니다. mri.mat를 불러오면 작업 공간에 두 변수 D(128x128x1x27, uint8형 클래스)와 회색조 컬러맵 map(89x3, double형 클래스)이 추가됩니다.

D는 사람의 두개골의 MRI 데이터 스캔에서 얻은 128x128의 가로 단층 27개로 구성되어 있습니다. D의 값 범위가 0부터 88까지이므로 유용한 시각적 범위를 갖는 Figure를 생성하려면 컬러맵이 필요합니다. montage와 호환되도록 D의 차원 수가 설정됩니다. 처음 2개 차원은 공간 차원입니다. 세 번째 차원은 컬러맵의 인덱스에 매핑되기 때문에 크기 1을 갖는 색 차원입니다. 참고로, RGB 영상 시퀀스의 경우 size(D,3)은 3입니다. 모든 영상 시퀀스와 마찬가지로 네 번째 차원은 시간 차원이지만 이 특정 사례에서는 공간 차원이기도 합니다. 따라서 D에는 세 개의 공간 차원이 있으며, imtransform 또는 tformarray를 사용하여 가로 단층을 시상면 단층(측두부를 보여줌) 또는 관상면 단층(정면, 전두부 또는 후두부를 보여줌)으로 변환할 수 있습니다.

D의 공간 차원 순서는 다음과 같습니다.

  • 차원 1: 전두부에서 후두부 순(전측에서 미측으로, 앞에서 뒤로)

  • 차원 2: 두부 왼쪽에서 두부 오른쪽 순

  • 차원 4: 두부 하단에서 두부 상단 순(아래에서 위로)

중요한 점은 세 차원에서의 샘플링 간격이 동일하지 않다는 것입니다. 세로 차원(4)의 샘플이 가로 차원보다 간격이 2.5배 더 넓습니다.

MRI 데이터 세트를 불러오고 27개 가로 단층을 몽타주 형태로 표시합니다.

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

2단계: IMTRANSFORM을 사용하여 가로 단층에서 시상면 단층 추출하기

D의 서브셋을 취해 D의 각 차원의 서로 다른 샘플링 간격과 공간 방향을 처리하도록 이를 변환하여 MRI 데이터에서 정중시상면 단층을 생성할 수 있습니다.

다음 구문은 정중시상면 단층에 필요한 데이터를 모두 추출합니다.

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

   128     1     1    27

그러나 M1은 128x1x1x27이기 때문에 영상 형태로 표시할 수 없습니다. reshape(또는 squeeze)를 사용하여 M1을 128x27 영상으로 변환하면 imshow를 통해 표시할 수 있습니다.

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

   128    27

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

M2의 차원 순서는 다음과 같습니다.

  • 차원 1: 전두부에서 후두부 순(전측에서 미측으로)

  • 차원 2: 두부 하단에서 두부 상단 순(아래에서 위로)

방향을 변경하고 세로(아래-위) 차원에서의 샘플링을 2.5배 늘리도록 M2를 변환하면 훨씬 더 만족스러운 보기 결과를 얻을 수 있습니다. 이렇게 하면 세 개의 모든 공간 차원에서의 샘플링 간격이 동일하게 됩니다. 전치를 시작으로 여러 단계를 진행하여 이 변환을 수행할 수도 있지만, 아래의 아핀 변환을 사용하면 메모리를 더 경제적으로 이용하면서 한 번에 변환할 수 있습니다.

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

maketform에 전달된 행렬의 상부 2x2 블록, [0 -2.5;1 0]에는 회전과 스케일링이 결합되어 있습니다. 변환 결과는 다음과 같습니다.

  • 차원 1: 두부 상단에서 두부 하단 순(위에서 아래로)

  • 차원 2: 전두부에서 후두부 순(전측에서 미측으로)

아래의

imtransform(M2,T0,'cubic')

호출로도 충분히 TM2에 적용하고 위에서 아래 방향으로 보간하며 좋은 해상도를 제공할 수 있습니다. 그러나 (출력) 차원 2에서는 리샘플링이 발생하지 않기 때문에 앞쪽에서 뒤쪽으로 3차 보간을 수행할 필요가 없습니다. 따라서 효율성을 높이면서 동일한 결과를 얻기 위해 차원 2에는 최근접이웃 리샘플링을 지정합니다.

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

3단계: TFORMARRAY를 사용하여 가로 단층에서 시상면 단층 추출하기

이 단계에서는 2단계와 동일한 결과를 얻지만, tformarray를 사용하여 세 개의 공간 차원을 두 개의 공간 차원으로 한 번에 변환합니다. 2단계가 공간 차원이 세 개 있는 배열로 시작하여 공간 차원이 두 개 있는 배열로 끝나기는 하지만, 중간 2차원 영상(M1M2)으로 인해 imtransform을 호출하여 M3을 생성하는 상황이 발생합니다. 이러한 중간 영상은 imtransform 대신에 tformarray를 사용할 경우 필요하지 않습니다. imtransform은 2차원에서 2차원으로 변환을 수행할 때 편리하지만, tformarray를 사용하면 N차원에서 M차원으로 변환(여기서 M과 N은 같을 필요가 없음)할 수 있습니다.

tformarray에서 TDIMS_A 인수를 지정하여 입력 배열에 대한 치환을 정의할 수 있습니다. 아래의 차원을 갖는 영상을 만들고

  • 차원 1: 위에서 아래로(원래 차원 4를 반전시킴)

  • 차원 2: 미측에서 전측으로(원래 차원 1)

원래 차원 2를 통해 단일 시상면을 추출하고자 하기 때문에 tdims_a를 [4 1 2]로 지정합니다. 2차원 아핀 변환 T1부터 시작하는 합성을 통해 tform을 생성합니다. 이 아핀 변환에서는 배열 좌표를 양수로 유지하기 위해 (새로운) 차원 1을 -2.5배만큼 스케일링하고 68.5만큼 더 이동시킵니다. 합성의 두 번째 부분은 사용자 지정 변환 T2로, 이 사용자 지정 변환에서는 매우 간단한 INVERSE_FCN을 사용하여 64번째 시상면을 추출합니다.

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);

참고로, T2Tc는 3차원 입력값을 2차원 입력값으로 처리합니다.

이전과 동일한 리샘플링 접근 방식을 사용하되 이번에는 세 번째 차원도 사용합니다.

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

tformarrayD의 공간 차원 세 개를 2차원 출력값으로 한 번에 변환합니다. 출력 영상은 66x128이며 원래의 27개 단면이 세로(아래-위) 방향으로 확장되어 66개가 됩니다.

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

이 결과는 imtransform을 사용한 이전 출력값과 동일합니다.

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

4단계: 시상면 단층을 만들고 표시하기

4차원 배열(세 번째 차원은 색 차원임)을 만듭니다. 이 4차원 배열을 사용하면, 30개 단면을 시작으로 왼쪽에서 오른쪽으로 이동하면서 단면을 하나씩 건너뛰며 총 35개의 프레임을 갖는 영상 시퀀스를 생성할 수 있습니다. 변환된 배열은 다음과 같이 구성됩니다.

  • 차원 1: 두부 상단에서 두부 하단 순(위에서 아래로)

  • 차원 2: 전두부에서 후두부 순(전측에서 미측으로)

  • 차원 4: 두부 왼쪽에서 두부 오른쪽 순

이전 단계에서처럼 TDIMS_A = [4 1 2]를 사용하여 입력 배열을 치환하고 세로 차원을 다시 뒤집고 재스케일링/리샘플링합니다. (3,3) 요소와 (4,3) 요소가 각각 0.5와 -14인 세 번째 차원을 추가하여 30, 32, ... 98을 1, 2, ..., 35에 매핑하는 것이 다를 뿐 아핀 변환은 위의 T1과 동일합니다. 이렇게 하면 35개 프레임이 정중시상면 단층의 중앙에 옵니다.

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

아래 tformarray 호출에서 TSIZE_B = [66 128 35]에는 왼쪽에서 오른쪽 방향으로 네 번째 차원(세 번째 변환 차원임)에 35개 프레임을 포함합니다. 리샘플러는 동일하게 유지합니다.

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

시상면 단층을 몽타주 형태로 표시합니다(몽타주 요소를 구분하기 위해 배열을 약간 채움).

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

5단계: 관상면 단층을 만들고 표시하기

관상면 단층을 생성하는 방법은 시상면 단층을 생성하는 방법과 거의 동일합니다. TDIMS_A[4 1 2]에서 [4 2 1]로 변경합니다. 8개 단면을 시작으로 뒤에서 앞으로 이동하면서 프레임을 하나씩 건너뛰며 일련의 45개 프레임을 만듭니다. 출력 배열의 차원 순서는 다음과 같습니다.

  • 차원 1: 두부 상단에서 두부 하단 순(위에서 아래로)

  • 차원 2: 두부 왼쪽에서 두부 오른쪽 순

  • 차원 4: 후두부에서 전두부 순(미측에서 전측으로)

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

아래 tformarray 호출에서 TSIZE_B = [66 128 48]은 세로 차원, 측면-측면 차원, 앞-뒤 차원을 각각 지정합니다. 리샘플러는 동일하게 유지합니다.

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

참고로, 3단계, 4단계, 5단계에서의 배열 치환과 뒤집기는 모두 tformarray 작업의 일부로 처리되었습니다.

관상면 단층을 몽타주 형태로 표시합니다(몽타주 요소를 구분하기 위해 배열을 약간 채움).

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