이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
3차원 MRI 데이터 세트의 단층 탐색하기
이 예제에서는 imtransform
함수와 tformarray
함수를 사용하여 3차원 MRI 데이터 세트에서 단층을 추출하는 방식으로 데이터 볼륨을 탐색하는 방법을 보여줍니다.
1단계: 가로 방향의 MRI를 불러온 후 확인하기
이 예제에서는 MATLAB®과 함께 제공되고 montage
와 immovie
에 대한 도움말 예제에도 사용되는 MRI 데이터 세트를 사용합니다. mri.mat
를 불러오면 작업 공간에 두 변수 D
(128×128×1×27, uint8
형 클래스)와 회색조 컬러맵 map
(89×3, double
형 클래스)이 추가됩니다.
D
는 사람의 두개골의 MRI 데이터 스캔에서 얻은 128×128의 가로 단층 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
은 128×1×1×27이기 때문에 영상 형태로 표시할 수 없습니다. reshape
(또는 squeeze
)를 사용하여 M1
을 128×27 영상으로 변환하면 imshow
를 통해 표시할 수 있습니다.
M2 = reshape(M1,[128 27]); size(M2)
ans = 1×2
128 27
imshow(M2,map)
title('Sagittal - Raw Data')
M2
의 차원 순서는 다음과 같습니다.
차원 1: 전두부에서 후두부 순(전측에서 미측으로)
차원 2: 두부 하단에서 두부 상단 순(아래에서 위로)
방향을 변경하고 세로(아래-위) 차원에서의 샘플링을 2.5배 늘리도록 M2
를 변환하면 훨씬 더 만족스러운 보기 결과를 얻을 수 있습니다. 이렇게 하면 세 개의 모든 공간 차원에서의 샘플링 간격이 동일하게 됩니다. 전치를 시작으로 여러 단계를 진행하여 이 변환을 수행할 수도 있지만, 아래의 아핀 변환을 사용하면 메모리를 더 경제적으로 이용하면서 한 번에 변환할 수 있습니다.
T0 = maketform('affine',[0 -2.5; 1 0; 0 0]);
maketform
에 전달된 행렬의 상부 2×2 블록, [0 -2.5;1 0]
에는 회전과 스케일링이 결합되어 있습니다. 변환 결과는 다음과 같습니다.
차원 1: 두부 상단에서 두부 하단 순(위에서 아래로)
차원 2: 전두부에서 후두부 순(전측에서 미측으로)
아래의
imtransform(M2,T0,'cubic')
호출로도 충분히 T
를 M2
에 적용하고 위에서 아래 방향으로 보간하며 좋은 해상도를 제공할 수 있습니다. 그러나 (출력) 차원 2에서는 리샘플링이 발생하지 않기 때문에 앞쪽에서 뒤쪽으로 3차 보간을 수행할 필요가 없습니다. 따라서 효율성을 높이면서 동일한 결과를 얻기 위해 차원 2에는 최근접이웃 리샘플링을 지정합니다.
R2 = makeresampler({'cubic','nearest'},'fill'); M3 = imtransform(M2,T0,R2); imshow(M3,map) title('Sagittal - imtransform')
3단계: tformarray
를 사용하여 가로 단층에서 시상면 단층 추출하기
이 단계에서는 2단계와 동일한 결과를 얻지만, tformarray
를 사용하여 세 개의 공간 차원을 두 개의 공간 차원으로 한 번에 변환합니다. 2단계가 공간 차원이 세 개 있는 배열로 시작하여 공간 차원이 두 개 있는 배열로 끝나기는 하지만, 중간 2차원 영상(M1
과 M2
)으로 인해 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);
참고로, T2
와 Tc
는 3차원 입력값을 2차원 입력값으로 처리합니다.
이전과 동일한 리샘플링 접근 방식을 사용하되 이번에는 세 번째 차원도 사용합니다.
R3 = makeresampler({'cubic','nearest','nearest'},'fill');
tformarray
는 D
의 공간 차원 세 개를 2차원 출력값으로 한 번에 변환합니다. 출력 영상은 66×128이며 원래의 27개 단면이 세로(아래-위) 방향으로 확장되어 66개가 됩니다.
M4 = tformarray(D,Tc,R3,[4 1 2],[1 2],[66 128],[],0);
이 결과는 imtransform
을 사용한 이전 출력값과 동일합니다.
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'); 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'); montage(C2,map) title('Coronal Slices')