fslroiやmrconvertを使ってNIfTI画像からスライスを1枚だけ削除する方法

拡散画像からZ軸(上下)方向に1枚だけスライスを除く必要がありました。

どんな方法があるか調べていたところ、fslroiがいいなと思いました。
そして、慶応大学病院の上田先生からMrtrixについてくるmrconvertでも同様のことができることを教わりました。
自分の備忘録も兼ねてここに記載しておきます。

実際に試せるように、サンプル画像を準備しました。この画像をベースに説明します。

オリエンテーションの確認

まず、fslhd を用いて、この画像のオリエンテーションを確認します。

fslhd dwi.nii.gz

この結果の qform は以下になります。

qform_name	Scanner Anat
qform_xorient	Right-to-Left
qform_yorient	Posterior-to-Anterior
qform_zorient	Inferior-to-Superior

スキャナーにおいて、X軸は左右、Y軸は前後、Z軸は上下で撮影しているということになります。
つまり、この画像は水平断ということになります。

dimensionの確認

続いて、この画像のdimensionを確認します。先程の fslhd の結果の最初の方を見ます。

dim1		256
dim2		256
dim3		80
dim4		31

これで、x軸方向に256, y軸方向に256, z軸方向に80, 軸として31 (b0も含む) ということがわかります。ちなみにこれは30軸でとっている画像ですので、b0は1ボリュームとわかります。

ここから、Z軸方向に最初の1枚だけを取り除きたいと思います。

fslroi を使う場合

まず、fslroi の挙動を確認します。
引数なしで、 fslroi とタイプすると、使い方が示されます。

fslroi
Usage: fslroi <input> <output> <xmin> <xsize> <ymin> <ysize> <zmin> <zsize>
       fslroi <input> <output> <tmin> <tsize>

       fslroi <input> <output> <xmin> <xsize> <ymin> <ysize> <zmin> <zsize> <tmin> <tsize>
Note: indexing (in both time and space) starts with 0 not 1! Inputting -1 for a size will set it to the full image extent for that dimension.

fslroi では、インデックスは0から開始と書いてあり、-1とすればその方向のすべての画像を使うと書いてあります。X軸とY軸方向に関してはすべて使いたいので、xminとyminは0を指定し、xsizeとysizeは-1を指定します。(256でもいいですが、全部使う時は-1とした方が汎用性が高いですね)
そして、Z軸方向は、最初だけ除くので、zminは0ではなく1とします。これがポイントです。枚数は80-1で79枚となりますので、zsizeは79となります。つまり以下のコマンドとなります。fslのツールは画像を指定する際に拡張子は指定しなくていいので、.nii.gzを抜いて指定していることに注意してください。出力画像はFSLを使って79枚にしたということで、dwi79f.nii.gz としましょう。

fslroi dwi dwi79f 0 -1 0 -1 1 79

fslval を使って、dwi79f.nii.gz のdim3だけぱっと見てみましょう。

fslval dwi79f dim3
79

きちんと1枚削られたようです。

mriconnvert を使う場合

mrconvert でも同様のことを行います。
mrconvert のヘルプを見てみます。

mrconvert

ヘルプの途中を抜き出します。

USAGE
     mrconvert [ options ] input output
        input        the input image.
        output       the output image.

Note that for both the -coord and -axes options, indexing starts from 0
rather than 1. E.g. -coord 3 <#> selects volumes (the fourth dimension)
from the series; -axes 0,1,2 includes only the three spatial axes in the
output image.

ここで、mrconvert でもインデックスは0からスタートすると書いてありますね。
-coord 3は実際は4番目のdimensionになると書いてあります。

mrconvert の際、もっとシンプルになります。

mrconvert 入力画像 出力画像 -coord 操作したい軸番号 残したいスライス

今、操作したい軸番号は Z軸です。水平断では、3番目の軸になります。
インデックスが0からはじまりますので、2を指定することになります。
そして残したいスライスですが、2番めから最後までとなります。
こちらも最初が0なので、1から最後までとなります。
MatlabやPythonで指定するように連続する数はコロンでつなげれば大丈夫です。
そして、最後はendでOKですので、今の場合、1:end となります。(1:79と同意になります。インデックスが0からはじまっているので、すべてでも0:79となります)

つまり、以下になります。出力画像はMRtrixを使っているので、dwi79m.nii.gzとします。

mrconvert dwi.nii.gz dwi79m.nii.gz -coord 2 1:end

こちらも、fslval を使って、dwi79m.nii.gz のdim3だけぱっと見てみましょう。

fslval dwi79m dim3
79

きちんと1枚削られたようです。

ヘッダーの比較

2つのプログラムでヘッダーがどう変わるのかも確認しておきたいと思いました。

fslhd を使ってヘッダーを吐き出します。

fslhd dwi79f > dwi79f_header.txt
fslhd dwi79m > dwi79m_header.txt

この2つを diff で比較してみましょう。

diff dwi79*.txt
1c1
< filename   dwi79f.nii.gz
---
> filename  dwi79m.nii.gz
57,58c57,58
< sto_xyz:1  -1.000000 0.000000 0.000000 133.356003 
< sto_xyz:2  0.000000 1.000000 0.000000 -89.139999 
---
> sto_xyz:1 -1.000000 0.000000 -0.000000 133.356003 
> sto_xyz:2 -0.000000 1.000000 -0.000000 -89.139999 
66c66
< descrip        6.0.4:ddd0a010
---
> descrip       MRtrix version: 3.0.2-31-g67bf6093

sformの sto_xyz:2 で、0.000000のところが、FSLでは符号なしで、MRtrixでは負の符号がついていますが、
それ以外は全く同じなので、影響なしと考えます。

ということで、どちらの方法でも同じものを得られることがわかりました。