ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

3 次元 MRI データセットからのスライスの調査

この例では、関数 imtransformtformarray を使用して 3 次元 MRI データセットからスライスを抽出し、多量のデータを調査する方法を示します。

手順 1: 水平 MRI の読み込みと表示

この例では、MATLAB® に付属しており、montage および immovie のヘルプの例で使用される MRI データセットを使用します。mri.mat の読み込みにより、2 つの変数がワークスペースに追加されます。その変数とは、D (128×128×1×27、uint8 クラス) と、グレースケール カラーマップ map (89×3、double クラス) です。

D は、人間の頭蓋の MRI データ スキャンによる 27 の 128×128 水平スライスで構成されます。D の値の範囲は 0 から 88 までなので、有効な視覚範囲で図を生成するには、カラーマップが必要になります。D の次元により、montage に対応できます。最初の 2 つの次元は空間です。3 番目の次元は色の次元であり、カラーマップにインデックスを付けるので、サイズが 1 になります(size(D,3) は RGB イメージ列に対して 3 になります)。4 番目の次元は一連のイメージの時間経過を示すものです。ただし、この場合は空間でもあります。D には 3 つの空間次元があるので、imtransform または tformarray を使用して水平スライスを、矢状スライス (頭部の外側から表示) または冠状 (前頭骨) スライス (頭部の前または後ろからの表示) に変換できます。

D の空間次元は以下のように順番付けられます。

  • 次元 1: 頭部の前から後ろ (頭方/前方から尾方/後方)

  • 次元 2: 頭部の左側から右側

  • 次元 4: 頭部の底部から上部 (下側から上側)。

重要な要素は、サンプリング間隔が 3 つの次元に沿って同じではないことです。垂直次元 (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) は M1imshow で表示可能な 128×27 のイメージに変換できます。

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

   128    27

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

M2 の次元は、次のような順序に並べられます。

  • 次元 1: 頭部の前から後ろ (頭方から尾方)

  • 次元 2: 頭部の底部から上部 (下側から上側)

M2 を変換して方向を変更し、垂直 (下側-上側) 次元に沿ってサンプリングを 2.5 の係数で増加させることで、より満足のいく表示を得ることができます。これにより、サンプリング間隔は 3 つすべての空間次元で等しくなります。これは、転置から始まる手順で行うことができますが、以下に示すアフィン変換を使用すると、シングルステップ変換が可能になり、メモリを無駄なく使用できるようになります。

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

maketform [0 -2.5;1 0] に渡される行列の上部 2×2 ブロックは、回転およびスケーリングを結合したものです。変換後、以下のようになります。

  • 次元 1: 頭部の上部から底部 (上側から下側)

  • 次元 2: 頭部の前から後ろ (頭方から尾方)

次の呼び出し

imtransform(M2,T0,'cubic')

は、上から下の方向に沿って内挿すると同時に、TM2 に適用し、最適な解像度を提供するのに十分です。ただし、(出力) 次元 2 に沿ったリサンプリングは発生しないので、前後方向での 3 次内挿の必要はありません。そのため、より効率性が高く結果が同じであるこの次元で最近傍リサンプリングを指定します。

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

手順 3: TFORMARRAY を使用した水平スライスからの矢状スライスの抽出

この手順では、手順 2 と同じ結果が得られますが、tformarray を使用して、3 つの空間次元から 2 つの空間次元まで 1 つの操作で移動します。手順 2 は 3 つの空間次元をもつ配列から始まり、2 つの空間次元をもつ配列で終わりますが、中間の 2 次元イメージ (M1M2) は、M3 を作成する imtransform 呼び出しのための準備をします。imtransform の代わりに tformarray を使用する場合、これらの中間イメージは不要です。imtransform は 2 次元から 2 次元への変換に便利ですが、tformarray は N 次元から M 次元への変換をサポートしています (ここで、M は N と同じである必要はありません)。

その TDIMS_A 引数により、tformarray で入力配列の置換を定義できるようになります。以下の次元でイメージを作成し、

  • 次元 1: 上側から下側 (元の次元 4、反転)

  • 次元 2: 尾方から頭方 (元の次元 1)

元の次元 2 を介して 1 つの矢状平面のみを抽出するので、tdims_a = [4 1 2] を指定します。2 次元アフィン変換 T1 で始まる合成により tform を作成します。このアフィン変換は (新しい) 次元 1 を -2.5 の係数でスケーリングし、68.5 のシフトを足して、配列の座標を正のままにします。合成の 2 番目の部分はカスタム変換 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 次元入力に移行することに注意してください。

前と同じリサンプリングの方法を使用しますが、3 番目の次元を含みます。

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

tformarray は、1 つのステップで D の 3 つの空間次元を 2 次元の出力に変換します。この出力イメージは 66×128 であり、垂直方向 (下部-上部) に 66 に拡張された元の 27 の平面をもっています。

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

この結果は、imtransform の前の出力と同じになります。

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

手順 4: 矢状スライスの作成と表示

4 次元配列 (3 番目の次元は色の次元です) を作成します。これを使用して、左から右に移動し、その中の 30 平面を開始し、その他すべての平面をスキップする、合計 35 フレームをもつイメージ列を生成できます。変換された配列には以下のものが含まれます。

  • 次元 1: 上部から底部 (上側から下側)

  • 次元 2: 前から後ろ (頭方から尾方)

  • 次元 4: 左側から右側

前の手順と同様に、TDIMS_A = [4 1 2] を使用して入力配列の順序を変えます。再度、垂直次元の反転と、再スケーリング/リサンプリングが行われます。アフィン変換は上記の T1 と似ていますが、相違点は、30、32、... 98 が 1、2、...、35 にマッピングされるように (3,3) の要素 0.5 と (4,3) の要素 -14 を選択して、3 番目の次元を加えることです。これにより、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] は 4 番目の左から右への次元 (3 番目の変換次元) に 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] に変更します。45 の一連のフレームを作成します。その中の 8 平面を開始して後ろから前に移動し、他のすべてのフレームをスキップします。出力配列の次元は以下のような順序に並べられます。

  • 次元 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');