拡散画像から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では負の符号がついていますが、
それ以外は全く同じなので、影響なしと考えます。
ということで、どちらの方法でも同じものを得られることがわかりました。