はじめに
前回、「DICOMタグをいじってみる」という記事を書きました。
DICOMタグをいじれるのなら、それをソフトとして作ってしまおうというのが今回の記事になります。
完成系としては、exeファイルまで作っていきたいと思います。
注意:pythonのバージョン3.7はexe化に対応していませんのでバージョン3.6にダウングレードしてください。
変更するタグを確認
まずは、匿名化していくタグの確認をしていきましょう。
患者情報のタグは予約タグなので検査画像のDICOMタグを開けば確認できます。
以下は、MRI画像のタグです。匿名化処理をして画像出力したもののタグです。
患者情報は ’0010’ のブロックに登録されています。
この画像出力の装置では患者IDと患者名が匿名化されています。
誕生日や、年齢は匿名化されていませんでした。(念のためモザイク処理をしています。)
なので、今回は患者名(0010,0010)と患者ID(0010,0020)の値を匿名化していきたいと思います。
プログラムの流れを組む
それでは、簡単に流れを組んでみたいと思います。
- ファイルを選択する
- 匿名化する値を考える
- DICOM画像を読み込む
- DICOMタグを書き換える
- DICOMを保存する
といった流れになると思います。
変数は必要なさそうですね。
DICOMタグの値表現方式は患者名に関してはPNで文字列、患者IDに関してはLOでLongStringで文字列との認識ですが、数値にて埋めることとします。
匿名化する値ですが、患者名に関しては単純に’Patient^name’、患者IDに関しては元が数値なので0で10桁を埋めることとします。。
DICOMタグを書き換えるにはまず画像を読み込みます。
DICOM画像を読み込むのはpydicom.dcmread(filepath)でできます。
その次はタグの変更です。
[タグの番地].value=値
で出来ます。
DICOMを保存するのは前回の記事「DICOMタグをいじってみる」で記載しましたが
save_as(file_path, write_like_original=False)
で出来ます。
プログラムを組む
- ファイルを選択する
- 匿名化する値を考える
- DICOMタグを書き換える
- DICOMを保存する
まずは、ファイルを選択するのですがDICOMタグを変更する画像はフォルダごと一気に変えてしまう事が多いと思いますのでフォルダで選択できるようにしましょう。以前の記事で「ダイアログで使って、フォルダでファイルを一括選択する。」で作成したモジュールを使います。
1 2 3 4 |
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート |
ファイルを選択するコードを書きます。
ファイルはfilenamesという変数名で受けるとします。
1 2 3 4 5 6 |
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート filenames = fs.folder_fileselect() |
選択した画像にタグを変更するので、先ほど選択したフォルダ内の画像に対して一つ一つ行っていきますので、for文で処理をしていきます。繰り返す回数はfilenamesに格納されているファイル数だけ繰り返します。(下コード7行目)
1 2 3 4 5 6 7 8 9 |
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート filenames = fs.folder_fileselect() for i in range(len(filenames)): |
その後は一つ一つDICOM画像を読み込み、DICOMタグを変更し、保存していく作業となります。DICOM画像を読み込むのはpydicomモジュールを使いますのでpydicomをimportしておきましょう。(下コードの4行目)
1 2 3 4 5 6 7 8 9 10 |
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート import pydicom filenames = fs.folder_fileselect() for i in range(len(filenames)): |
DICOM画像を読み込みます。DICOM画像のパスはfilenamesのリストに格納されています。リストから読みだすのはfilenames[番号]ですので、for文の中ではfilenames[i]で読みだせます。
1 2 3 4 5 6 7 8 9 10 |
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート import pydicom filenames = fs.folder_fileselect() for i in range(len(filenames)): dcm = pydicom.dcmread(filenames[i]) |
読み込みが終わったらタグの編集に入ります。変更するタグは
患者名(0010,0010)と患者ID(0010,0020)です。それぞれ、’Patient name’と’0000000000’で書き換えをしたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 |
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート import pydicom filenames = fs.folder_fileselect() for i in range(len(filenames)): dcm = pydicom.dcmread(filenames[i]) dcm[0x0010,0x0010].value = ’Patient name’ dcm[0x0010,0x0020].value = ’0000000000’ |
書き換えが終了しましたので画像として保存していきます。
先ほども記載しましたが保存は
save_as(file_path, write_like_original=False)
file_pathはDICOM画像を読み込んだfilenamesですので、filenames[i]でいけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート import pydicom filenames = fs.folder_fileselect() for i in range(len(filenames)): dcm = pydicom.dcmread(filenames[i]) dcm[0x0010,0x0010].value = ‘Patient^name’ dcm[0x0010,0x0020].value = ‘0000000000’ dcm.save_as(filenames[i], write_like_original=False) |
これで、先ほど考えた流れは全て完了でプログラムは完成です。
それではプログラムを動かしてみましょう。
実行後の確認ですimage-Jで確認です。
左側が実行前、右側が実行後です。きちんと指定した値に変更されています。
プログラムは計画通りに動いてくれました。
この後は、このプログラムをexe化(アプリとして保存)していきたいとおもいます。
exe化(アプリ化)
プロフラムをexe化するためには’pyinstaller’というモジュールを使います。インストールしていない場合は、コマンドプロンプトを開いてインストールしましょう。(分からない方は「OpenCV,pydicomのインストール」をお手本にしてください。)
コマンドプロンプトを開いたのち以下のコードを実行します。
1 2 3 |
pip install pyinstaller |
この後はコマンドプロンプト上での作業となります。
まずは、ファイルが保存しているフォルダまで移動します。コマンドは’cd’です。
pycharmをインストール先を変更していなければ以下のディレクトリとなります。
C:\Users\ユーザー名\PycharmProjects
基本的に、コマンドプロンプトを立ち上げると
C:\Users\ユーザー名\ (\は¥で表示されていると思います)
で表示されていますので、その後に
cd p
と打ち込み、キーボードの’Tab’を押す度にPから始まるフォルダが表示されていきます。’PycharmProjects’が表示されたらEnterキーを押します。
その後、同様に ’cd フォルダ名’ でプログラムを保存したフォルダに移動します。
もし面倒であったら、プログラムがあるフォルダを開いてアドレスバーを右クリック、アドレスをコピーしてコマンドプロンプトに「cd 」の後にペーストで一気に移動できます。
移動した後に以下のコマンドを実行します。
1 2 3 |
pyinstaller ファイル名.py —onefile |
いかがでしょうか?フォルダ内にbuildとdistというフォルダが作成されdistフォルダの中に、exe化されたファイルがありませんか? これをダブルクリックすることでプログラムが実行されます。
このファイルは、pythonがインストールされていないパソコンでも利用出ることができるので大変便利です。
いかがでしたか?きちんとできましたか?
お疲れ様でした。
さいごに
今回は、DICOMの匿名化処理のプログラムを作成し、exe化(アプリ化)してみました。
ただ、pythonのバージョンが3.7を使っている方は多分エラーが出てしまっていると思いますので次回その対処法をやっていきたいと思います。
環境
- windows10
- python3.6.1
- Anaconda custom(64-bit)
- PyCharm2020.2(Communication Edition)