AFNIの3dresampleを使った画像のボクセルサイズの変更

これまで、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方向に指定するので、問題ありません。

いろんなツールを上手に組み合わせるとやれることが広がりますね。

AFNIの3dresampleを使った画像のボクセルサイズの変更” へのコメント

  1. 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というよりは、ちょっとした操作をしたい時に便利そうですね。
          覚えておきます。

          今後もいろいろ教えてください。どうぞよろしくお願いします。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください