#やりたいこと
Google Colaboratoryを使って、pydicomでDICOMを処理する。
#環境
-
Google Chrome
インターネットブラウザはGoogle Chromeが必要なので、Edge、Safari、FireFoxなどを使っている人はChromeをインストールしておくこと。OSなどは、Chromeが動くものであればよい。(と思う) -
Google Drive
Google ColaboratoryはGoogleDrive上で動作するので、Googleアカウント(G-mail)を取得しておくこと。 -
Google Colaboratory
この記事のように、GoogleColabをインストールしておく。
https://deepinsider.jp/tutor/deeplearningenv/prepare
#必要なもの
テスト用にDICOM画像を用意しておく。
ここから好きなものをダウンロードしておく。
(http://www.jira-net.or.jp/dicom/dicom_data_01_02.html)
同じ種類の画像でもJPEG圧縮、非圧縮など、種類があるが、pydicomのおかげで、リスト内のものであればどの画像でもよい。
失礼しました。圧縮されている場合は依存ライブラリによって制約がありました(https://pydicom.github.io/pydicom/stable/image_data_handlers.html)。
以下の操作は、非圧縮のDICOM画像で試して下さい。リンクのDICOMで言えば、JPGではなく、LEEのものを選択します。圧縮された画像を試したい場合は、Anaconda環境を構築して、GDCMのPythonラッパーをpydicomと一緒にインストールして使います。この手順はここにあります。(2019/11/6追記)
圧縮画像を解凍して使う場合は、この記事の最後の方を参照して下さい。
今回はいくつかダウンロードして、「JIRA_DICOM_SAMPLE」というフォルダにまとめておいた。
この記事では例としてこの胸部X線(CR_LEE_IR87a.dcm)の画像を使う。
#手順
はじめに
- GoogleDriveを開く。
- 「Colab Notebooks」フォルダを新規作成
GoogleDrive内に「Colab Notebooks」フォルダを新規作成しておく(+新規>フォルダ)。 - DICOMデータをDriveに移動
この例では、「JIRA_DICOM_SAMPLE」というフォルダにまとめているので、このフォルダごと、ドラッグアンドドロップでGoogleDrive内に新規作成した「Colab Notebooks」フォルダへコピーする。
- 「Colab Notebooks」フォルダを開き、ここへ新しいノートブックを作成する。
+新規>その他>Colaboratoryを選択する。
開いたら、名前を直接編集しておく。例えば、「pydicom_how_to_open_dcm」。
あとの使い方は、基本的にJupyterというスクリプトエディタと同じ。
コードを書く
コードセルをファイルメニュー下の「+コード」ボタンから追加します。
まずは、pydicomの最新パッケージをロードします。 (これはあくまでもこのノートブックで利用するためのもので、 自分のローカル環境で使えるようにするわけではありません。)
次のように入力します。
!pip install pydicom
入力できたら、再生ボタンで実行します。実行すると、一時的にデータをダウンロードします。
これで、pydicomがこのノートブック内で使えるようになりました。
次に、Google Drive内の「JIRA_DICOM_SAMPLE」フォルダに、このノートブックからアクセスできるようにします。 次のように入力し、再生ボタンで実行してみましょう。
# Load the Drive helper and mount
from google.colab import drive
# This will prompt for authorization.
drive.mount('/content/drive')
実行すると、画面が遷移して、認証コードが自動で表示されるので、それをコピーしてEnterします。(この画面だけではわかりませんが、やってみればわかります)
Google Driveの内容を確認してみます。
次のようにコードを書き、再生ボタンで実行してみましょう。 「My Drive」というフォルダ名が出力されます。
!ls /content/drive
この'My Drive'という名称の仮のフォルダが、自分のGoogleDriveフォルダとして認識されます。
画像をpydicomを使って開いてみます。
このJIRA_DICOM_SAMPLEフォルダには、胸部レントゲン画像(CR_LEE_IR87a.dcm)を入れています。
このようにコードして、再生ボタンで実行してみましょう。
DICOMデータがロードされます。
import pydicom
drive = '/content/drive/My Drive/Colab Notebooks/JIRA_DICOM_SAMPLE/'
ds = pydicom.dcmread(drive+'CR_LEE_IR87a.dcm')
DICOMはメタデータの集まりですから、そのままでは画像は見れません。
メタデータ(つまりpydicomでいうデータセットという概念)からピクセルデータを取り出します。
このようになります。
#ピクセルを取り出す(ndarrayとして扱っています)
pixels = ds.pixel_array
#画像として表示してみます。
import matplotlib.pyplot as plt
plt.imshow(pixels)#2つとも必要
plt.show()
白黒反転しているので、インバートしてみます。
(左右反転もしていますが、このデータのピクセルそのままなので、今回は無視します)
from skimage import util
pixels = util.invert(pixels)
plt.imshow(pixels)#2つとも必要
plt.show()
グリッド線が入ってしまうので、色を変えるか、消すかします。
# plt.grid(c='grey')#色を変える
plt.grid(None)#グリッド線を消す
plt.imshow(pixels)#2つとも必要
plt.show()
今回は以上でゴールです。
お付き合い頂いた方、お疲れ様でした。
圧縮画像の解凍
上記の方法は非圧縮画像の操作でしたが、以下の操作は、JPEG/JPEG2000などに圧縮されている画像を扱う方法を示します。
新しいノートブックを作って試してください。
データは「CR_JPG_IR87a」で試しています。
minicondaを使ってGDCMを仮想環境にインストールしてから画像を操作する
Minicondaを用意します。
# install miniconda
!wget https://repo.continuum.io/miniconda/Miniconda3-4.5.4-Linux-x86_64.sh && bash Miniconda3-4.5.4-Linux-x86_64.sh -bfp /usr/local
順序があるので注意して下さい。
pydicomをインストールしてから、gdcmをインストールします。
!conda install -c conda-forge pydicom
!conda install -c conda-forge gdcm
condaでインストールしたライブラリにパスを通します。
# for use conda
# 2019/11時点ではColabのデフォルトpythonバージョンは3.6
import sys
sys.path.append('/usr/local/lib/python3.6/site-packages')
画像を確認します。
上記のGoogleDrive操作を終えておきます。
import pydicom
# ここは上記のGoogleDrive操作を終えたことを想定しています。
drive = '/content/drive/My Drive/Colab Notebooks/JIRA_DICOM_SAMPLE/'
ds = pydicom.dcmread(drive+'CR_JPG_IR87a.dcm')
# ColabのFileタブにアップロードした場合
# ds = pydicom.dcmread('CR_JPG_IR87a.dcm')
ds.decompress()
#ピクセルを取り出す(ndarrayとして扱っています)
pixels = ds.pixel_array
#画像として表示してみます。
import matplotlib.pyplot as plt
plt.imshow(pixels)#2つとも必要
plt.show()
#この記事を書いたモチベーション
学生や初学者がDICOMを扱うための障壁を薄く、低くするため。
#その他
コメント歓迎です。間違いなどありましたらご指摘いただけますと幸いです。
#参考URL
JIRA DICOMの世界:http://www.jira-net.or.jp/dicom/dicom_data_02_01.html
https://stackoverflow.com/questions/48376580/google-colab-how-to-read-data-from-my-google-drive/53592023