【Nibabel】脳画像をPythonで読み込む方法

MacOS

MRIなどの脳画像をNifti formatで直接Pythonで読み込む際、便利なパッケージがあったため紹介します。NiBabelはマサチューセッツ工科大学で開発され、NIfTI format を含めた複数の脳画像形式に対応しています。本ページでは NIfTI format を読み込む方法を中心に説明します。

NiBabelではNIfTIに加え、GIfTIANALYZE format を読み込むことが可能です。またFreeSurfer のgeometryやannotation, morphometry fileの読み込み・編集も可能です。

NiBabelを導入する

まずはpipでインストールしましょう。Python ver3.9.0 / NiBabel ver 3.2.1 を使用しています。

pip install nibabel

読み込んだデータはnumpy配列で処理することができます。matplotlibとmathも用意しておきましょう。

import nibabel as nib
import numpy as np 
import matplotlib.pyplot as plt
import math

NIfTI formatの読み込み

NiBabelでは load() で画像データを読み込み、imgオブジェクトを作成します。ここでは Test.nii ファイルを用いて進めていきます。任意の画像ファイルを使用してください。

img_file = 'Test.nii'
img = nib.load(img_file) 

NIfTIデータを読み込んだ img の内容を確認しましょう。DICOM→NIfTIでconvertしたファイルの場合、nifty1 type の画像ファイルを利用していることと思います。その場合、以下添付画像の様に表示されます。

img

データ内容の確認

nifty1 typeの画像ファイルは以下のパラメータによって構成されています。

  1. dataobj
  2. affine
  3. header
  4. extra
  5. file_map

本ページでは上記3つについて記載します。

dataobjはNIfTI画像の配列データです。その内容はget_fdata()でnumpy配列として利用することができます。type()print(X.shape)でデータを確認しましょう。

img_data = img.get_fdata()
type(img_data)
print(img_data.shape)

img_data.shapeから256×256×176のnumpy配列ということが分かります。matoplotlibを用いてスライスを描画してみましょう。img_data.shape[x]/2をIntで入力するためにmath.floor()を使っています。

test.niiはMPRAGE画像であり、(x,y,z)=(256,256,176)とすると、x方向がaxial, y方向がcoronal, z方向がsaggitalとなります。x,y,zは撮像条件によってNiBabel上で設定されるため、個々のデータごとに確認してください。

img_data[x,y,z]に任意の数値を入れてください。下記では各画像サイズの半分になるように指定しています。

data_shape = math.floor(img_data.shape[2]/2)
print ("Slice",data_shape)
plt.imshow(img_data[data_shape,:,:], cmap='gray', origin='lower')

次にaffineについてです。.affineで元データ(dataobj)をボクセル座標に変換するためのアフィン変換を出力できます。

img_affine=img.affine
print(img_affine)

headerにはヘッダー情報が含まれています。.headerで出力できます。

img_header=img.header
print(img_header)

NIfTI formatの出力

オブジェクト配列とアフィン変換の情報を用いてNIfTI形式で出力することができます。今回は入力したnumpy配列をそのまま出力に用いていますが、任意の処理した配列を用いてください。nib.Nifti1Image(X,affine=Y) Xにはdataobjと同様のnumpy配列を、Yにはaffineを指定してください。

img_nii=nib.Nifti1Image(img_data,affine=img_affine)
type(img_nii)

nib.save(X,Y)でNIfTI形式のファイルを作成できます。Xには上記で指定したオブジェクトを、Yには出力ファイル名を入力してください。出力先を選択する場合はファイル名の前にパスを挿入してください。

nib.save(img_nii,'Test2.nii')

基本的な使い方は以上です。

コメント

タイトルとURLをコピーしました