pydicomをgoogle colaboratoryで使う

#やりたいこと
Google Colaboratoryを使って、pydicomでDICOMを処理する。

#環境

1. Google Chrome
インターネットブラウザはGoogle Chromeが必要なので、Edge、Safari、FireFoxなどを使っている人はChromeをインストールしておくこと。OSなどは、Chromeが動くものであればよい。（と思う）

2. Google Drive
Google ColaboratoryはGoogleDrive上で動作するので、Googleアカウント（G-mail）を取得しておくこと。

3. 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と一緒にインストールして使います。この手順は[ここ](https://pydicom.github.io/pydicom/dev/old/getting_started.html)にあります。（2019/11/6追記）
圧縮画像を解凍して使う場合は、この記事の最後の方を参照して下さい。

今回はいくつかダウンロードして、「JIRA_DICOM_SAMPLE」というフォルダにまとめておいた。
![Screenshot from 2019-05-07 10-54-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/47cd647c-212c-9701-a24e-d4c7b4719713.png)

この記事では例としてこの胸部X線（CR_LEE_IR87a.dcm）の画像を使う。
![CR_LEE_IR87a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/446eb080-e8f8-cede-e914-afe71987f7b2.jpeg)

#手順
## はじめに
1. GoogleDriveを開く。
2. 「Colab Notebooks」フォルダを新規作成
GoogleDrive内に「Colab Notebooks」フォルダを新規作成しておく（＋新規>フォルダ）。
3. DICOMデータをDriveに移動
この例では、「JIRA_DICOM_SAMPLE」というフォルダにまとめているので、このフォルダごと、ドラッグアンドドロップでGoogleDrive内に新規作成した「Colab Notebooks」フォルダへコピーする。

![Screenshot from 2019-05-07 11-18-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/597f528e-357c-7f80-17f7-499a7b3ab128.png)

4. 「Colab Notebooks」フォルダを開き、ここへ新しいノートブックを作成する。
＋新規>その他>Colaboratoryを選択する。

![Screenshot from 2019-05-07 10-58-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/7c12b181-d893-b34d-4ab0-c36b442593cc.png)

開いたら、名前を直接編集しておく。例えば、「pydicom_how_to_open_dcm」。
あとの使い方は、基本的にJupyterというスクリプトエディタと同じ。

![Screenshot from 2019-05-07 11-13-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/045cc89d-0739-499f-df1b-deeb63555feb.png)

## コードを書く
コードセルをファイルメニュー下の「＋コード」ボタンから追加します。
まずは、pydicomの最新パッケージをロードします。 （これはあくまでもこのノートブックで利用するためのもので、 自分のローカル環境で使えるようにするわけではありません。）
次のように入力します。

```
!pip install pydicom
```
入力できたら、再生ボタンで実行します。実行すると、一時的にデータをダウンロードします。
![Screenshot from 2019-05-07 11-28-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/d38fa281-7aff-4629-2295-7de0742392aa.png)

これで、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
```
![Screenshot from 2019-05-07 11-32-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/7871392c-0ec3-9981-0371-6dcdaa93ed9f.png)

この'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)#２つとも必要
plt.show()  
```

![Screenshot from 2019-05-07 11-40-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/7417d2a3-4eb2-6d27-487c-f4bef41c3ee3.png)

白黒反転しているので、インバートしてみます。
（左右反転もしていますが、このデータのピクセルそのままなので、今回は無視します）

```
from skimage import util
pixels = util.invert(pixels)

plt.imshow(pixels)#２つとも必要
plt.show() 
```

![Screenshot from 2019-05-07 11-42-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/b1ab2dae-7898-0f9f-2ace-35896d787aff.png)

グリッド線が入ってしまうので、色を変えるか、消すかします。

```
# plt.grid(c='grey')#色を変える
plt.grid(None)#グリッド線を消す
plt.imshow(pixels)#２つとも必要
plt.show()
```

![Screenshot from 2019-05-07 11-43-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/ff1e4965-0c85-5674-af4d-bcbd4d2fecb4.png)

今回は以上でゴールです。
お付き合い頂いた方、お疲れ様でした。

## 圧縮画像の解凍

上記の方法は非圧縮画像の操作でしたが、以下の操作は、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)#２つとも必要
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