Pythonを使ってDICOM画像から体積評価

はじめに

この記事ではPythonを使った医療画像処理の方法について紹介しています。
初めてPythonに触れる方でも学びやすいようにGoogle Colaboratoryを使った例を示しています。
Google Colaboratoryの基本的な使い方については、たくさん解説記事があると思うのでそちらを参考にしてみてください。

無料部分はどういった流れで処理を行い、どのような結果が得られるのかだけを見ることができます。
(具体的な処理コードの記載なし)

有料部分では以下の例を含めたNotebookがDLできますのでよろしければご利用ください。

Pythonを使ってDICOM画像から体積を計算

ここではPythonを使ったMPR(Multi Planar Reconstruction)の方法について紹介します。
以下の例では"Structural MRI datasets"のデータを利用しています。

お持ちのデータを利用する場合はファイルの読み込みの箇所を変えるといったように適宜修正してお使いください。

準備

以下のようなフォルダの階層構造のもとで行っています。
自分で追加しているものはすべて"Structural MRI datasets"のものです。

home(デフォルトのフォルダ)
┗ sample_data(デフォルトで読み込まれるもの)
┗ DICOM(自分で追加したもの)
   ┗ FLAIR(自分で追加したもの)
   ┗ T1(自分で追加したもの)
   ┗ T2(自分で追加したもの)
   ┗ ROI(自分で追加したもの)
┗ NIfTI(自分で追加したもの)

Colaboratoryのデフォルト環境では、医療画像を処理するのに必要なパッケージがインストールされていません。

そのため、まずは必要なパッケージをインストールします。

!pip install pydicom

DICOMファイルの読み込み

今回は例としてFLAIR画像とセットになっているROI(Region of Interest)画像のペアを使用します。

ROI部分についてはお手持ちのモデルで行った脳のある領域のSegmentation結果で置き換えるなど、ご自分の目的にあったもので置き換えていただいても大丈夫です。

FLAIR画像と対応するROI画像を並べて表示

表示された結果の一部抜粋

今回の例の場合、画像を見る限り白質病変部分がROIとして設定されているように見えます。

体積の計算

体積を計算するにあたってまず行うのは画像中のROIの面積、つまりpixel数をカウントすることです。
例として1枚ROI画像をもってきて計算してみましょう。

ROI画像の例

今回例として使っているStructural MRI DatasetsではROI部分が1、それ以外の部分は0となっており簡単に計算できます。

ご自分で用意した画像がそのようなきれいな数字になっていない場合もあると思います。そのような場合はまず値の分布を確認し、適当な閾値を設定した上で閾値以下のものを0としましょう。

pixelのカウントが終わったら、次は1pixel当たりの体積(voxel)を計算します。ベンダーによって異なる場合があるかもしれませんが、一般には次のように計算できます。

voxel = ([spacing between slices] + [slice thickness]) * [pixel spacing]^2

ここで

  • spacing between slices: slice間の距離

  • slice thickness: 1枚のsliceの厚さ

  • pixel spacing: 1pixelの縦(横)の長さ

です。

注意事項: 一般にpixel spacingは縦と横の長さが同じ正方形になっているので二乗としていますが、もし縦と横の長さが違う場合はそれらを掛け合わせてください。

今回の例では、すべてのSliceで

  • spacing between slices

  • slice thickness

  • pixel spacing

は共通しているので、どれか1枚を読み込んできて計算するだけで大丈夫です。

今回はROI画像もDICOMなのでfiles_roiを使っていますが、元画像であるfilesのほうを使っても問題ありません。お手持ちのデータでやる場合はむしろそちらのほうが一般的だと思います。

これでvoxelが計算できたので、

[ROIのpixel数] * voxel

で体積が計算できます。

もしSliceによってvoxel計算に使う各値が異なる場合は、次のように各Sliceごとに計算しましょう。


単位に関しては基本的にmm^3になると思います。

ご自分のデータで計算する際は、

  • spacing between slices

  • slice thickness

  • pixel spacing

の単位を予め確認しておくことをおすすめします。


ここから先は

63字 / 1ファイル

¥ 200

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?