Contents

NIfTIファイルの読み書き

%Matlab R2017bからimage processing toolboxでNIfTIファイルの読み書きができるようになりました。
%残念ながらGIfTIファイルには対応していません。
% A MATLAB GIfTI library
% https://www.artefact.tk/software/matlab/gifti/
% のgifti-1.6.zip (v1.6)を使うことにします。
% 但し、GIfTIファイルの一部は読めないようです。

clear;
pathname='c:/users/akira/';
filename='20000406_132343s002a1001.nii.gz';
data1=niftiread([pathname,filename]);% データ本体
header=niftiinfo([pathname,filename]);

ヘッダーの詳細

構造体になっています。 header.Transform.Tが変換行列、 header.raw.dimが配列の大きさ、 header.raw.pixdimがボクセルの大きさ、 になっています。

header % ヘッダー
header.Transform.T % 変換行列
header.raw.dim % 最初は〇次元配列の次数
header.raw.pixdim
header = 

  フィールドをもつ struct:

                 Filename: 'c:\users\akira\20000406_132343s002a1001.nii.gz'
              Filemoddate: '17-9-2017 08:14:51'
                 Filesize: 4426587
              Description: 'TE=2.799999952;sec=0.0000'
                ImageSize: [256 256 86]
          PixelDimensions: [0.9375 0.9375 2]
                 Datatype: 'int16'
             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]


ans =

   -0.9375         0         0         0
         0    0.9375         0         0
         0         0    2.0000         0
  120.0000 -106.6625  -67.0000    1.0000


ans =

     3   256   256    86     1     1     1     1


ans =

  1 列から 7 列

   -1.0000    0.9375    0.9375    2.0000    0.0450    1.0000    1.0000

  8 列

         0

画像表示

通常のMRIとBrainVISAでlabel付けしたデータとを比較します。 BrainVISAでは左右が反転するようです。

filename2='voronoi_20000406_132343s002a1001.nii.gz';
data2=niftiread([pathname,filename2]);
dim=header.raw.dim(2:4);% 最初は〇次元配列の次数 cf fMRI
pix=abs(header.raw.pixdim(2:4));
close all;
for m=1:2
    figure('color',[1,1,1]);
    switch m
        case 1
            title('通常のMRI');
            data=data1;
            clim=[min(data(:)),max(data(:))*0.5];
        case 2
            title('ラベル付き');
            data=data2;
            clim=[min(data(:)),max(data(:))];
    end
    for n=1:3
        subplot(2,2,n);
        switch n
            case 1
                d=squeeze(data(:,:,round(dim(3)/2)));
                p=pix([1,2,3]);
            case 2
                d=squeeze(data(:,round(dim(2)/2),:));
                p=pix([1,3,2]);
            case 3
                d=squeeze(data(round(dim(1)/2),:,:));
                p=pix([2,3,1]);
        end
        imagesc(rot90(d',2));
        daspect(1./p);
        if m==1 % 昔と違ってcolormapはaxes別に指定できるようになってます
            colormap(gray);
        else
            colormap(jet);
        end
        set(gca,'clim',clim);
        colorbar;
    end
end

大脳半球だけ抽出してNIfTIファイルで保存

ヘッダーはMRIのものを使います。

close all;
data3=0.5*((data2==1)+(data2==2));
data3=int16(data3(end:-1:1,:,:)).*data1;
clim=[min(data1(:)),max(data1(:))*0.5];
for m=1:2
    figure('color',[1,1,1]);
    switch m
        case 1
            title('通常のMRI');
            data=data1;
            clim=[min(data(:)),max(data(:))*0.5];
        case 2
            title('切り出したMRI');
            data=data3;
    end
    for n=1:3
        subplot(2,2,n);
        switch n
            case 1
                d=squeeze(data(:,:,round(dim(3)/2)));
                p=pix([1,2,3]);
            case 2
                d=squeeze(data(:,round(dim(2)/2),:));
                p=pix([1,3,2]);
            case 3
                d=squeeze(data(round(dim(1)/2),:,:));
                p=pix([2,3,1]);
        end
        imagesc(rot90(d',2));
        daspect(1./p);
        colormap(gray);
        set(gca,'clim',clim);
        colorbar;
    end
end
% 拡張子niiやnii.gzは不要です
niftiwrite(data3,[pathname,'newbrain'],header,'compressed',true);

MESH化

MATLABのisosurface関数を使ってメッシュを作成します。 予めsmooth3関数で平滑化した方がいいようです。

close all;
addpath('C:\ToBeInstalled\MATLAB\gifti-1.6');% A GIfTI Matlab libraryを組み込む
figure('color',[1,1,1]);
for n=1:4
    v=double(data2==n);
    v=smooth3(v);% 平滑化
    v=isosurface(v,0.7);
    v.vertices=v.vertices*diag(pix);% ボクセルサイズを考慮
    % v=reducepatch(v,20000); % ポリゴン面を少なくするとき
    h=patch(v,'edgecolor','none','facecolor',rand(1,3),'tag',sprintf('patch%d',n));
    if n==1
        hold on;
    end
end
daspect([1,1,1]);
view([120,20]);
light('position',[1,0,0]);
rotate3d on;

GIfTIファイル化

A MATLAB GIfTI Libraryを使うと簡単にポリゴンメッシュ表示やGIfTIファイルの作成ができます。

close all;
addpath('C:\ToBeInstalled\MATLAB\gifti-1.6');% A GIfTI Matlab libraryを組み込む
v=isosurface(smooth3(double(data2==1)),0.5);
g=gifti(v);
figure('color',[1,1,1]);
plot(g);
save(g,[pathname,'Lhemi.gii'],'Base64Binary');
警告: cameramenu は将来のリリースで削除される予定です。代わりに cameratoolbar を使用してくだ
さい。 

GIfTIファイルの読み込み

BrainVISAで作成したものは左右が逆になっているようです。 読み込んだ内容を表示させようとしたんですが、できませんでした。 GIfTIの内部構造にversionによる違いがあるのかもしれません。 python側で対応するしかないようです。

addpath('C:\ToBeInstalled\MATLAB\gifti-1.6');% \@gifti');
filename3='20000406_132343s002a1001_Lhemi.gii';
g=gifti([pathname,filename3]);
figure('color',[1,1,1]);
plot(g);
警告: cameramenu は将来のリリースで削除される予定です。代わりに cameratoolbar を使用してくだ
さい。 

読み込んだGIfTIファイルの中身表示

gとタイプしただけではエラーになります。

fieldnames(g)
size(g.faces)
size(g.vertices)
% g.matはエラーになる。
g.vertices(:,1)=-g.vertices(:,1);% 左右逆転
% g.mat 変換行列は表示されません。
figure('color',[1,1,1]);
plot(g);
ans =

  1×3 の cell 配列

    {'faces'}    {'mat'}    {'vertices'}


ans =

      113508           3


ans =

       56756           3

警告: cameramenu は将来のリリースで削除される予定です。代わりに cameratoolbar を使用してくだ
さい。