top of page
抽象雲

NiBabel徹底入門!pythonで医療画像処理を実践しよう

  • 執筆者の写真: macky
    macky
  • 5月2日
  • 読了時間: 9分

更新日:2 日前


niabel徹底入門!
niabel徹底入門!
医療画像処理は、現代の医療診断や研究において非常に重要な役割を果たしています。MRI、CT、PETなどの画像診断技術の発展により、膨大な量の医療画像データが日々生成されています。これらのデータを効率的に処理・分析するためには、専門的なツールが必要です。

Pythonは、その豊富なライブラリと使いやすさから、医療画像処理の分野でも広く採用されています。特に「NiBabel」は、神経画像データの読み込み・操作・保存を行うための強力なPythonライブラリであり、多くの研究者や開発者に利用されています。

本記事では、NiBabelの基本的な使い方から応用例まで、実践的なPythonコード例とともに解説します。Google Colaboratoryを使った環境構築から始め、実際の医療画像データを用いた処理方法を詳しく説明します。

NiBabelとは

NiBabel(Neuroimaging in Python: NIFTI, ANALYZE, GIFTI, CIFTI, MINC, MGH/MGZ, ECAT, DICOM, BRIK/HEAD, AFNI, NRRD)は、神経画像データの読み込み・操作・書き込みを行うためのPythonパッケージです。主に以下のような医療画像フォーマットをサポートしています:

  • NIfTI-1 (.nii, .nii.gz)
  • ANALYZE (.hdr/.img)
  • MGH/MGZ (.mgh, .mgz)
  • その他多数

NiBabelは、Nipy(Neuroimaging in Python)プロジェクトの一部として開発されており、医療画像処理のための他のPythonツール(例:NilearnDipy)と組み合わせて使用されることが多いです。

Google Colaboratoryでの環境構築

Google Colaboratory(略してColab)は、ブラウザ上でPythonコードを実行できるクラウドサービスです。GPUを無料で利用できる点や、環境構築が容易な点から、医療画像処理のような計算負荷の高いタスクに適しています。

Google Colabの主な特徴と利点は以下の通りです:
  • 無料のGPU/TPUアクセス:深層学習や大規模データ処理などの計算負荷の高いタスクを、無料でGPUやTPUを使って高速に実行できます。
  • 環境構築が不要:Pythonや多くの科学計算・機械学習ライブラリが事前にインストールされているため、すぐにコーディングを始められます。
  • Jupyterノートブック互換:コードセルとテキストセルを組み合わせた形式で、コードの実行結果とドキュメントを一体化して管理できます。
  • Google Driveとの連携:Google Driveと統合されているため、データの保存や共有が簡単に行えます。
  • コラボレーション機能:共同編集やコメント機能により、チームでの開発がスムーズに行えます。
  • ウェブブラウザだけで利用可能:特別なソフトウェアのインストールが不要で、インターネット接続があればどこからでもアクセスできます。

医療画像処理のような専門的な作業では、ローカル環境の構築に時間がかかることがありますが、Google Colabを使えばその手間を省き、すぐに実験やデータ解析に取り組むことができます。

まずは、ColabでNiBabelを使用するための環境を整えましょう。ライブラリのインポートから始めます。

サンプルデータの取得

実際に医療画像を処理するために、サンプルデータを取得しましょう。ここでは、GitHubリポジトリから脳MRIのサンプルデータをダウンロードして使用します。


医療画像データの読み込みと基本情報の表示

NiBabelを使用して医療画像(NIfTIファイル)を読み込む際、まず最初に使うのが load 関数です。この関数は、NIfTIファイル(.niiや.nii.gzなど)を読み込み、画像データ本体と空間情報・メタデータを含む「画像オブジェクト」を生成します。
このオブジェクトから、画像データ本体(NumPy配列として取得可能)、アフィン変換行列(affine)、ヘッダー情報(header)など、医療画像解析に必要な情報を簡単に取り出すことができます。


load関数は、指定したパスのNIfTIファイルを読み込み、NiBabelの画像オブジェクト(例:Nifti1Image)を返します。このオブジェクトは、画像データ本体だけでなく、空間情報やメタデータも保持しているため、医療画像処理のさまざまな場面で活用できます。

affine属性は、画像のボクセル座標(配列のインデックス)を実空間(mm単位など)に変換するための4×4行列です。この行列により、画像データがどの位置・向き・スケールで空間上に配置されているかを正確に記述できます。
  • 用途例
    • 複数の画像を空間的に重ね合わせる(コアジストレーション)
    • 実際の解剖学的位置と画像データを対応付ける
  • 行列の構造
    • 上3行3列:回転・スケーリング・シアー(変形)成分
    • 最終列(上3行):平行移動(オフセット)成分
    • 最終行:常に [0, 0, 0, 1]

header属性は、画像データに付随するメタデータ(付加情報)を格納したオブジェクトです。NIfTI形式では、ヘッダーに画像の次元数、ボクセルサイズ、データ型、スキャン条件など多くの情報が含まれています。
  • 主なフィールド例
    • dim:画像の次元情報(例:3次元画像なら[3, x, y, z, ...])
    • pixdim:各次元のボクセルサイズ(mm単位)
    • datatype:データ型(int16, float32など)

これらを利用することで、画像の読み込みから空間情報の取得、メタデータの参照まで一貫して行えます。affineとheaderの重要性は超入門編だけでは扱いきれないため、別の機会に解説を行う予定です。


よく使われる便利な関数: as_closest_canonical と squeeze_image

医療画像処理では、画像の向きを標準化したり、不要な次元を削除したりすることがよくあります。NiBabelには、これらの操作を簡単に行うための便利な関数が用意されています。as_closest_canonical関数は画像データを「標準的な」向き(RAS: Right-Anterior-Superior)に変換し、squeeze_image関数はサイズが1の余分な次元を削除します。これらは実際の医療画像処理のワークフローでは非常に一般的に使用されている関数です。

医療画像を用いた研究においてよくあるのが、画像の左右がわからなくなるといった事象です。特に、脳MRIにおいては基本的に構造が左右対称であるために、医師の方でもそれを見分けるのは難易度が高いです。そのため、ADNI(Alzheimer's Disease Neuroimaging Initiative)と呼ばれるアルツハイマー型認知症研究のための大規模データセットでは頭の右側にカプセルを置いて撮像を行うことがルール化されています。研究が進んでから脳の左右が違っていたということにならなためにも、as_closest_canonical関数を用いてすべての画像を同じ方向で読むように心がけましょう。


画像データの取得と表示

NiBabelで読み込んだ画像データは、NumPy配列として取得できます。これにより、様々な数値処理や可視化が可能になります。NumPy配列にするにはget_fdata属性を用います。ここではNumPy配列にした脳MRIを画像として表示させてみましょう。
出力画像
出力画像

conform関数の詳細

conform関数は、MRI画像を標準的な形状とボクセルサイズに変換するための強力なツールです。conform関数は、引数で細かく指定しない場合、デフォルトで1mm等方性ボクセルサイズの256×256×256の3D画像に変換します。これにより、異なるスキャナーや撮像シーケンスから取得した画像を均一な形式に揃えることができます。自分でサイズと解像度を指定することも可能です。
conform(from_img, out_shape=(256, 256, 256), voxel_size=(1.0, 1.0, 1.0), order=3, cval=0.0, orientation='RAS', out_class=None)
  • from_img:変換したい画像オブジェクト
    • dataobj、affine、header、shapeの属性を持つオブジェクトであること
    • 通常はNiBabelで読み込んだNiftiImageオブジェクト
  • out_shape:出力画像の形状(デフォルト: (256, 256, 256))
    • 出力する3D画像のボクセル数をタプルで指定
  • voxel_size:出力画像のボクセルサイズ(mm単位)(デフォルト: (1.0, 1.0, 1.0))
    • 出力画像の各次元でのボクセルサイズをmm単位で指定
    • デフォルトは1mm等方性ボクセル(すべての方向で同じサイズ)
  • order:スプライン補間の次数(デフォルト: 3)
    • 0:最近傍補間(離散的、エッジを保持)
    • 1:線形補間(連続的)
    • 2:2次スプライン補間
    • 3:3次スプライン補間(デフォルト、より滑らか)
    • 4:4次スプライン補間(最も滑らか)
    • 高次の補間ほど滑らかな結果が得られるが、計算コストが高くなる
  • cval:境界外の値(デフォルト: 0.0)
    • 補間時に画像境界外の点に使用される値
    • mode='constant'の場合にのみ適用される
  • orientation:出力画像の向き(デフォルト: 'RAS')
    • 'RAS':Right-Anterior-Superior(右-前-上)
    • 他の向きも指定可能('LAS', 'LPI'など)

conform関数は、さまざまな引数を組み合わせることで、用途に応じた柔軟な画像変換が可能です。ここでは、代表的なパターンをいくつか紹介します。

出力画像(変換後)
出力画像(変換後)


NumPy配列からNiBabel形式への再変換と保存

画像データをNumPy配列として処理した後、再びNiBabel形式(Nifti1Image)に戻して保存することで、他のツールや解析パイプラインでも再利用できるようになります。ここでは、NumPy配列からNIfTIファイルとして保存する一連の流れと、保存時の各引数について詳しく解説します。

  1. NumPy配列として取得img.get_fdata()で画像データをNumPy配列として取得します。これにより、NumPyの各種演算や画像処理が自由に行えます。
  2. NiBabel形式に再変換nib.Nifti1Image(data, affine, header)の各引数は以下の通りです。
    • data:保存したい画像データ(NumPy配列)。形状やデータ型はNIfTI仕様に準拠している必要があります。
    • affine:4×4のアフィン変換行列。画像の空間的な位置や向きを定義します。通常は元画像のimg.affineをそのまま使います。
    • header:NIfTIヘッダー情報。データ型やボクセルサイズ、スライス数などのメタデータを含みます。元画像のimg.headerを流用することで、空間情報や撮像条件を保持できます。
  3. ファイルとして保存nib.save(画像オブジェクト, ファイル名, overwrite=False)でNIfTIファイルとして保存します。
    • 画像オブジェクト:Nifti1ImageなどNiBabelの画像クラスのインスタンス。
    • ファイル名:保存先のファイル名。拡張子が.nii.gzの場合は自動的にgzip圧縮されます。.niiの場合は非圧縮で保存されます。
    • overwrite(オプション):既存ファイルがある場合に上書きするかどうかを指定します。デフォルトはFalseで、同名ファイルが存在するとエラーになります。上書きしたい場合はoverwrite=Trueを指定してください(NiBabel 5.1以降で利用可能)。


まとめ

本記事では、NiBabelを用いた医療画像(特にMRIデータ)の基本的な取り扱い方法から、実践的な前処理・変換・保存までの一連の流れを解説しました。NiBabelは、PythonのNumPy配列と密接に連携できるため、画像データの数値処理や可視化、さらには機械学習や統計解析への応用も容易です。

特に、conform関数を活用することで、異なるスキャナーや撮像条件で取得された画像を統一フォーマットに揃え、解析の信頼性や再現性を高めることができます。また、NumPy配列として処理した画像を再びNIfTI形式で保存することで、他の解析ツールやワークフローとの連携もスムーズに行えます。

医療画像処理の現場では、データの標準化や再利用性がますます重要になっています。NiBabelを活用することで、効率的かつ柔軟な画像解析パイプラインを構築し、研究や臨床現場でのデータ活用の幅を広げていきましょう。

次のアクション
  • NiBabelの公式ドキュメントやAPIリファレンスを参照し、より高度な機能や他フォーマットの取り扱いにも挑戦してみましょう。
  • NilearnやDipyなど、NiBabelと連携可能な他のPythonライブラリも活用し、画像解析の自動化や可視化をさらに発展させてください。
  • 本記事のサンプルコードを自身のデータセットに適用し、実際の研究や業務での活用を進めてみましょう。

参考リンク
bottom of page