Pythonを使ったDICOM画像のMPR

はじめに

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

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

有料部分では以下の例はもちろんAxial→Saggitalの場合の例も含めたNotebookがDLできますのでよろしければご利用ください。

Pythonを使ったMR画像のMPR

ここでは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画像を使います。

例として使っているこのデータの場合、ファイルを名前順にソートすればSlice Locationについてもソートされる並びになっています。

126.000000017126
120.000004620979
114.000001640321
107.999998653959
102.000003257812
96.0000002714503
90.0000010887822
84.0000019061141
78.0000027248572
71.9999997363484
66.0000005504604
60.0000013645724
54.0000002757640
48.0000010959481
42.0000009623565
36.0000008316171
30.0000009780162
24.0000010227228
18.0000013674451
12.0000003001028
6.00000110168799
0.0

Slice Locationの出力例

しかし、自分で用意したデータを使う場合はいつもこのように整頓されるとは限りません。
そのため、まずはSlice Locationに基づいて順番に並べる方法を紹介します。

Sliceがきちんと順番に並んでいない例をつくるために、一旦ファイル順をシャッフルします。

Slice Locationでソートする

順番に並べる方法は単純で、

  1. DICOMファイル名とSlice Locationとの値のペアをつくる

  2. Slice Locationでソートする

  3. ソート後の順番で処理する

これだけです。

以下の例ではファイル名ではなく何番目のファイルなのかでやっています。



Slice Locationの降順でソートされた結果が表示されたと思います。

ここではファイル名順に並べたときの結果にあわせて降順にしましたが、昇順で並べたいときは"reverse=False"にすればできます。

では、ソートした結果が正しいか確認してみましょう

DICOM/FLAIR/BRAINIX_DICOM_FLAIR_IM-0001-0001.dcm DICOM/FLAIR/BRAINIX_DICOM_FLAIR_IM-0001-0002.dcm

DICOM/FLAIR/BRAINIX_DICOM_FLAIR_IM-0001-0022.dcm

出力例

ファイル名順に出力されており、Slice Locationできちんとソートされていることがわかりました。

MPR(Multi Planar Reconstruction)

Slice Location順に並べる方法がわかるとできるようになることの1つとして、MPR(Multi Planar Reconstruction)があります。

ここでは元々AxialだったものをCoronalへ変換する例を紹介します。

まずは空(要素ががすべて0)の3次元arrayをつくります。

(288, 288, 22)

出力例

きちんとできていれば、画像サイズの縦横とファイル数になっているはずです。

次にSlice Locationでソートした順にファイルを読み込んで値を入れていきます。

3次元arrayをつくったあとは、元と違う切り口で任意のSlice番号を指定すれば異なる断面の画像が得られます。

ここではCoronalで101枚目(index=100)を指定してみます。


出力画像例

まだ補間(補正)処理を行っていないのでつぶれた画像が表示されたと思います。

各Slice間の距離(Slice Between Slices)がない分つぶれてしまっているので、y軸の長さをそれにあわせて補正します。

元の長さより長くなるので補間処理が入りますが、ここでは単純にOpenCVのresize()を使ったものを紹介します。


MPRで作成したCoronal画像

縦横比は補正されましたがぼやけた画像になっていると思います。

例として使っている"Structural MRI datasets"のものは22枚しかない(Slice間隔が厚い)ためなにか高度な補間方法を用いない限りはこのようになってしまいます。

逆を言えば、枚数が多ければ(Slice間隔が薄ければ)OpenCVの単なるresizeでも鮮明な画像が得られます。

ここから先は

129字 / 1ファイル

¥ 200

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