MATLABから直接Nifti(.nii)ファイルを読む方法、matファイルで脳画像を受け渡す方法
もし、脳画像を格納したmatファイルを渡され、SPMなど脳画像関係のソフトが「全く入っていない」、あるのはMATLABだけというPCでNifti(.nii)を表示しなくてはいけない場合、どううしたら良いでしょう。
以下の関数を使用します。
-niftiread(), niftiwrite(), niftiinfo()
(R2017b以降でImage Processing Toolboxが入っている場合可能です。)
たとえば、私の脳の構造画像(Siemens Mgnetom Skyra 3T, 32 channel head coilによるMPRAGE画像)、s20180530-0002-00001-000001-01.niiは以下のようにmatファイル化することができます。
>> data=niftiread('s20180530-0002-00001-000001-01.nii');
>> info=niftiinfo('s20180530-0002-00001-000001-01.nii');
>> info
info =
フィールドをもつ struct:
Filename: 'E:\20180530akama_TMC\analyze\structural\s20180530-0002-00001-000001-01.nii'
Filemoddate: '11-6-2018 11:59:30'
Filesize: 37159264
Description: '3T 3D GR\IR TR=1800ms/TE=2.5ms/FA=9deg/SO=IR\PFP 30-May-2018 21:41:22.815'
ImageSize: [288 288 224]
PixelDimensions: [0.7986 0.7986 0.8000]
Datatype: 'uint16'
BitsPerPixel: 16
SpaceUnits: 'Millimeter'
TimeUnits: 'Second'
AdditiveOffset: 0
MultiplicativeScaling: 1
TimeOffset: 0
SliceCode: 'Unknown'
FrequencyDimension: 0
PhaseDimension: 0
SpatialDimension: 0
DisplayIntensityRange: [0 0]
TransformName: 'Sform'
Transform: [1×1 affine3d]
Qfactor: -1
raw: [1×1 struct]
>> save('akama_mprage.mat')
matファイルで画像を受け取った人は
>>load('akama_mprage.mat')
>>niftiwrite(data,'akamamprage.nii',info)
あるいは
>>niftiwrite(data,info.Filename,info)
でniftiファイルに復元すれば良いのです。
あるいはWindowsの場合、
>> fpath=strsplit(info.Filename, '\')
fpath =
1×5 の cell 配列
{'E:'} {'20180530akama_TMC'} {'analyze'} {'structural'} {'s20180530-0002-…'}
>> newfname=fpath{size(fpath,2)}
newfname =
's20180530-0002-00001-000001-01.nii'
でパス抜きのファイル名も出力できます。
それではMATLABのbuilt-in関数だけで脳画像を表示するにはどうしたらよいでしょう。それはdataに対してimgesc()関数を使います。
>>imagesc(data(:,:,30))
%これでFigureのウィンドウが開き、z軸に垂直に30のところでスライスした断面が画像表示されます。つまりaxial(transversal)な画像です。
%3次元配列さえ作れていれば、imagesc関数によりMatlab上で描画できます。
%正中線近くの矢状面を表示したいときは、ちょっと工夫が必要で
>>imagesc(flipud(transpose(permute(data(floor(0.5* size(data,2)),:,:), [2 3 1]))))
%になります。
%転置して上下をフリップしないと通常の表示にはなりません。
%冠状面の表示もちょっとやっかいで、たとえば
>>imagesc(flipud(transpose(permute(data(:,floor(0.5* size(data,1)),:), [1 3 2]))))
%になります。permute関数の引数に注意してください。
%同様に
>> imagesc(flipud(transpose(data(:,:,floor(0.5* size(data,3))))))
さらに
s=subplot(2,2,1)
imagesc(flipud(transpose(permute(data(floor(0.5* size(data,2)),:,:), [2 3 1]))))
hold on
s=subplot(2,2,2)
imagesc(flipud(transpose(permute(data(:,floor(0.5* size(data,1)),:), [1 3 2]))))
hold on
s=subplot(2,2,3)
imagesc(flipud(transpose(data(:,:,floor(0.5* size(data,3))))))
hold on