PythonでDICOM画像を表示する
キーワード:python, pydicom, pyplot, DICOM
医用画像の標準規格DICOMで保存された画像ファイルを読み込み表示してみる。
はじめてDICOM画像を表示したのはこのページを見てでした。
このプログラムがきっかけになり,Pythonに転向してしまいました。
Pydicomをインストールする
DICOM画像を読み込むにはPydicomのライブラリをインストールする必要があります。ターミナルから以下のようにしてpydicomをインストールします。
(␣は空白,⏎はenterキーです)
$pip␣install␣-U␣pydicom⏎
「-U」はインストール時にアップグレードを行うオプションです。
インストールが上手くいっているかpythonを起動して確認してみます。
>>>import pydicom >>>from pydicom.data import get_testdata_files >>>filename = get_testdata_files("rtplan.dcm")[0] >>>ds = pydicom.dcmread(filename) # plan dataset >>>ds.PatientName 'Last^First^mid^pre'
Pydicomのサンプルを対話モードで入力してしてみます。
Pydicomインストール時にサンプルのDICOMファイル(”rtplan.dcm”)もインストールされているのでそのまま利用してみる。
(蛇足ですが,それにしてもrtplanとは放射線治療計画のDICOMデータなのだろうけど,ずいぶんマイナーなデータをサンプルに使ってますね)
変数dsにDICOMファイル”rtplan.dcm”の情報が格納されます。
ds.PatientNameはDICOMファイル内の患者氏名を指定している。ここでは匿名化された'Last^First^mid^pre'が表示されます。
デモ用DICOM画像のダウンロード
DICOM画像を読み込む準備をします。
デモ用のDICOM画像(私の過去のCT画像8枚です)をダウンロードし解凍します。
ディレクトリdcmdir1を現在のプログラムを作成するディレクトリ(例えばsrc01)の親ディレクトリ(一つ上のディレクトリ)にコピーします。
~/Documents/src01/readDicom.py #src01にプログラムが入る
~/Documents/dcmdir1/Brain01 #dcmdir1にDICOM画像が入る
DICOM画像を読み込んで表示する
それでは下記のプログラムをテキストエディタを使って入力してみます。
(テキストエディタにはgeditを使います。プログラムを作成するディレクトリ内で右クリックしリストから「新しいドキュメント/空のドキュメント」を指定し,「無題のドキュメント」を作成し,ファイルを右クリックして「名前の変更」を選択して,「readDicom.py」と変更します。)
readDicom.py
from matplotlib import pyplot as plt import pydicom d = pydicom.read_file('../dcmdir1/Brain01') print(d) #タグの表示 wc = d.WindowCenter #ウィンドウセンターの取得 ww = d.WindowWidth #ウィンドウ幅の取得 print("wc=", wc) print("ww=", ww) max = wc + ww / 2 #表示最大画素値 min = wc - ww / 2 #表示最小画素値 print("max=", max) print("min=", min) #画像の表示 plt.imshow(d.pixel_array, cmap = 'gray', vmax = max, vmin = min) plt.show()
実行すると下のようにCT画像が表示されます。(ちょっと感動。はじめて表示したときは感動した。)
$python␣readDicom.py⏎
僅か10数行のプログラムでDICOM画像が表示さる。
こんなに簡単にDICOM画像が扱えることに感動。
私がPythonのとりこになった理由である。
プログラムの解説
はじめに,DICOM画像を処理できるようにpydicomライブラリをインポートし,画像表示のためのmatplotlibライブラリのpyplotモジュールをインポートする。
次にプログラムのあるディレクトリの親ディレクトリ(../)の下のdcmdir1の中のDICOMフィルBrain01を読み込み変数dに代入する。
変数dにはDICOMのメタ情報(患者氏名やID,検査日などの情報)と画像データが格納されている。変数dをprintするとメタ情報を表示できる。
(0008, 0000) Group Length UL: 430
(0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'AXIAL']
(0008, 0016) SOP Class UID UI: CT Image Storage
(0008, 0018) SOP Instance UID UI: 1.2.392.200036.9116.2.6.1.16.161・・・・・
(0008, 0020) Study Date DA: '20101112'
中略
(0010, 0010) Patient's Name PN: 'UESUGI^MASAHITO'
中略
(7005, 1030) [Main Modality in Study] CS: 'CT'
(7005, 1040) [DLP Dose Length Product] FD: 74.6
(7fe0, 0010) Pixel Data OW: Array of 524288 bytes
wc= 40
ww= 80
max= 80.0
min= 0.0
(0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'AXIAL']
(0008, 0016) SOP Class UID UI: CT Image Storage
(0008, 0018) SOP Instance UID UI: 1.2.392.200036.9116.2.6.1.16.161・・・・・
(0008, 0020) Study Date DA: '20101112'
中略
(0010, 0010) Patient's Name PN: 'UESUGI^MASAHITO'
中略
(7005, 1030) [Main Modality in Study] CS: 'CT'
(7005, 1040) [DLP Dose Length Product] FD: 74.6
(7fe0, 0010) Pixel Data OW: Array of 524288 bytes
wc= 40
ww= 80
max= 80.0
min= 0.0
DICOM画像を適正に表示するためにウィンドウセンターとウィンドウ幅をDICOMのメタ情報から取得wcとwwに代入する。
wc = d.WindowCenter #ウィンドウセンターの取得
ww = d.WindowWidth #ウィンドウ幅の取得
CT画像はCT値と呼ばれる値(画素値)で構成されていて,それは空気を-1000,水を0,骨を+1000として画像を構成している。したがって,CT装置のメーカーが異なってもCT値は同じように出力される。
そのまま表示するとコントラストの低い,メリハリのないボヤっとした画像になってしまう。
ウィンドウセンターとウィンドウ幅にはこの画像を表示するのに最適な条件が入っている。
ウィンドウセンターの値(デモ画像では40)を中心にウィンドウ幅の値(同80)で表示すると最適な表示条件で表示される。
最適な画像表示になるようにウィンドウセンターとウィンドウ幅を調整することをウィンドニングという。
最適な条件で表示するために,表示するCT値の上限maxと下限minを計算する。
上限max(プログラム結果では80)よりも大きなCT値は白く,下限min(同0)よりも小さなCT値は黒く表示するようにする。
最大値maxはウィンドウ幅wwの半分の値をウィンドウセンターwcに加えて求める。
最大値maxより大きなCT値は白く,最小値minより小さなCT値は黒く表示する。
minとmaxで挟まれたCT値は0(黒)から255(白)の256諧調で表示されるため,コントラストのある見やすい画像が表示できる。
最後にimshowメソッド使って画像を表示する。
引数のd.pixel_arrayはDICOMファイルから読み込んだ画像データである。
cmap='gray'はモノクログレイ表示を指定している。
そしてvmax=max, vmin=minは画像データd.pixel_arrayの表示上限・下限範囲を指定した。
plt.show()メソッドで画像をウィンドウに表示する。
imshowメソッドの詳細はここから
まとめ
今回,pydicomライブラリを用いて簡単にDICOM画像を読込必要なメタ情報を表示した。さらに pyplotのメソッドを使ってDICOM画像を表示することができました。これからpydicomを使いながら医用画像を人工知能学習させる方法(pyゼミ3で)を学びます。
0 件のコメント:
コメントを投稿