これまで、MRI画像のボクセルサイズを変更する時に、簡単な方法がないなと思っていました。
コマンドひとつで簡単にできないかなといろいろ検索したところ、AFNIの3dresampleというプログラムに行き着きました。
書式は簡単です。
たとえば、ボクセルサイズを2mm x 2mm x 2mm にしたいとしたら、
$ 3dresample -dxyz 2 2 2 -prefix 出力画像 -inset 入力画像
となります。
入力画像、出力画像、ともにNIFTI画像(.nii, .nii.gz)が使えます。
FSLViewやITK-SNAPでは、2つの画像を重ねあわせる時、ボクセルサイズが一致していることが必須ですので、これを知っていることで、作業が簡単になるかもしれません。
たとえば、
VBMで標準化が終わったデータ(smwc1V_subj01.nii)を、FSLのfslinfoでみると以下のようになっています。
$ fslinfo smwc1V_subj01.nii data_type FLOAT32 dim1 121 dim2 145 dim3 121 dim4 1 datatype 16 pixdim1 1.500000 pixdim2 1.500000 pixdim3 1.500000 pixdim4 0.000000 cal_max 0.0000 cal_min 0.0000 file_type NIFTI-1+
この画像のボクセルサイズはpixdimをみればいいので、1.5 1.5 1.5であることがわかります。
一方、rs-fMRIをFSLで前処理をした後に、AFNIのInstacorrで相関マップを作成した時の画像(DMN_subj01.niiとします)をfslinfoで見ると以下のようになります。
$ fslinfo DMN_subj01.nii data_type FLOAT32 dim1 45 dim2 54 dim3 45 dim4 1 datatype 16 pixdim1 4.000000 pixdim2 4.000000 pixdim3 4.000000 pixdim4 0.000000 cal_max 0.0000 cal_min 0.0000 file_type NIFTI-1+
こちらのボクセルサイズは 4 4 4となります。
この画像をFSLViewで同時に表示させようとするとエラーが出ます。
なので、MRI画像の方を、小さくしてみます。
3dresampleを使います。
$ 3dresample -dxyz 4 4 4 -prefix 4mm_smwc1V_subj01.nii \ -inset smwc1V_subj01.nii
あっというまに終わります。
その結果を見てみます。
$ fslinfo 4mm_smwc1V_subj01.nii data_type FLOAT32 dim1 45 dim2 54 dim3 45 dim4 1 datatype 16 pixdim1 4.000000 pixdim2 4.000000 pixdim3 4.000000 pixdim4 0.000000 cal_max 0.0000 cal_min 0.0000 file_type NIFTI-1+
今回は画像のDimensionがぴったりあっていますね。
これを、FSLViewで表示させると、今回は問題なく表示できます。
FSLでやろうとすると、flirtを使うことになります。参照画像に、あわせこむ対象の画像を指定してあげる感じでしょうか。-applyisoxfmを使うことで、等方性のボクセルのサイズを指定することができます。
$ flirt -ref DMN_subj01.nii -in smwc1V_subj01.nii \ -out 4mm_smwc1V_subj01 -applyisoxfm 4
となります。
私が知識がないだけですが、ボクセルサイズがisovoxelじゃないとこれはうまく使えません。
3dresampleですと、3方向に指定するので、問題ありません。
いろんなツールを上手に組み合わせるとやれることが広がりますね。
FSLの fslchpixdim はいかがでしょうか?
以下のようにコマンド入力をお試し下さい。
fslchpixdim
cp $FSLDIR/data/standard/MNI152_T1_1mm.nii.gz ./
fslinfo ./MNI152_T1_1mm.nii.gz
fslchpixdim ./MNI152_T1_1mm.nii.gz 2 2 2
fslinfo ./MNI152_T1_1mm.nii.gz
下地先生
先生だったら、絶対にいいコマンドを知っていると思って先生のコメントをお待ちしていました。
fslchpixdimですね。これもとっても簡単ですね。
ブログの内容を更新します!
下地先生
今、早速やってみました。
そうしたところ、ひとつ困ったことになりました。
pixdimは確かに変わるのですが、dimが変わらないんです。
fslinfoでみると、
元の画像は、
$ fslinfo ./MNI152_T1_1mm.nii.gz
data_type INT16
dim1 182
dim2 218
dim3 182
dim4 1
datatype 4
pixdim1 1.000000
pixdim2 1.000000
pixdim3 1.000000
pixdim4 1.000000
ですが、
fslchpixdim ./MNI152_T1_1mm.nii.gz 2 2 2
としてから、改めてfslinfoでみると、
$ fslinfo ./MNI152_T1_1mm.nii.gz
data_type INT16
dim1 182
dim2 218
dim3 182
dim4 1
datatype 4
pixdim1 2.000000
pixdim2 2.000000
pixdim3 2.000000
pixdim4 1.000000
こうなってしまって、たしかにpixdimは2になっていますが、dimが元通りです。
これは何か解決法がありますか?
教えていただければと思います。よろしくお願いします。
少し調べてみました。
結論としては単純な再サンプリングであればAFNIの3dresampleが良さそうです。
FSLのfslchpixdim は change pixel dimensions, but keep everything else the same と記載されていて、ヘッダー情報を書きかけるだけで再サンプリングは行わないので、今回の用途には不適と思われました。同じくFSLには
fslcreatehd というコマンドもありますが、これもヘッダー情報を書きかけるだけで再サンプリングは行いません。
FSLのflirt なら再サンプリングも行いますが、本来は標準脳へのレジストレーションのためのコマンドなので色々と注意が必要です。
標準脳空間への変換ならflirt の本来の使い方なので問題ありませんが、変換先(参照先)がnative space にある場合には、いったん標準脳空間を経由させる2段階の変形が推奨されています。
さらに(脳画像ではなくバイナリの)マスク像を変形させる場合にはflirt の補完処理をオプションで無効にして、fslmaths で辺縁の半端なボクセルを処理する方が良いようです。
(参考)
FSLwiki
https://www.jiscmail.ac.uk/cgi-bin/webadmin?A2=ind1302&L=FSL&D=0&1=FSL&9=A&I=-3&J=on&d=No+Match%3BMatch%3BMatches&z=4&P=477152
下地先生
ご丁寧に調べていただき、どうもありがとうございました。
fslchpixdimはresamplingというよりは、ちょっとした操作をしたい時に便利そうですね。
覚えておきます。
今後もいろいろ教えてください。どうぞよろしくお願いします。