all-in-one-seo-pack
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114easy-fancybox
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114urvanov-syntax-highlighter
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114breadcrumb-navxt
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114advanced-ads
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114lancr
ドメインの翻訳の読み込みが早すぎました。これは通常、プラグインまたはテーマの一部のコードが早すぎるタイミングで実行されていることを示しています。翻訳は init
アクション以降で読み込む必要があります。 詳しくは WordPress のデバッグをご覧ください。 (このメッセージはバージョン 6.7.0 で追加されました) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114前回、「DICOMタグをいじってみる」という記事を書きました。
DICOMタグをいじれるのなら、それをソフトとして作ってしまおうというのが今回の記事になります。
完成系としては、exeファイルまで作っていきたいと思います。
注意:pythonのバージョン3.7はexe化に対応していませんのでバージョン3.6にダウングレードしてください。
まずは、匿名化していくタグの確認をしていきましょう。
患者情報のタグは予約タグなので検査画像のDICOMタグを開けば確認できます。
以下は、MRI画像のタグです。匿名化処理をして画像出力したもののタグです。
患者情報は ’0010’ のブロックに登録されています。
この画像出力の装置では患者IDと患者名が匿名化されています。
誕生日や、年齢は匿名化されていませんでした。(念のためモザイク処理をしています。)
なので、今回は患者名(0010,0010)と患者ID(0010,0020)の値を匿名化していきたいと思います。
それでは、簡単に流れを組んでみたいと思います。
といった流れになると思います。
変数は必要なさそうですね。
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タグを変更する画像はフォルダごと一気に変えてしまう事が多いと思いますのでフォルダで選択できるようにしましょう。以前の記事で「ダイアログで使って、フォルダでファイルを一括選択する。」で作成したモジュールを使います。
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート
ファイルを選択するコードを書きます。
ファイルはfilenamesという変数名で受けるとします。
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート filenames = fs.folder_fileselect()
選択した画像にタグを変更するので、先ほど選択したフォルダ内の画像に対して一つ一つ行っていきますので、for文で処理をしていきます。繰り返す回数はfilenamesに格納されているファイル数だけ繰り返します。(下コード7行目)
# -*- coding: utf-8 -*- import fileselect as fs #ファイルパス取得のモジュールをインポート filenames = fs.folder_fileselect() for i in range(len(filenames)):
その後は一つ一つDICOM画像を読み込み、DICOMタグを変更し、保存していく作業となります。DICOM画像を読み込むのはpydicomモジュールを使いますのでpydicomをimportしておきましょう。(下コードの4行目)
# -*- 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]で読みだせます。
# -*- 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’で書き換えをしたいと思います。
# -*- 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]でいけます。
# -*- 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化するためには’pyinstaller’というモジュールを使います。インストールしていない場合は、コマンドプロンプトを開いてインストールしましょう。(分からない方は「OpenCV,pydicomのインストール」をお手本にしてください。)
コマンドプロンプトを開いたのち以下のコードを実行します。
pip install pyinstaller
この後はコマンドプロンプト上での作業となります。
まずは、ファイルが保存しているフォルダまで移動します。コマンドは’cd’です。
pycharmをインストール先を変更していなければ以下のディレクトリとなります。
C:\Users\ユーザー名\PycharmProjects
基本的に、コマンドプロンプトを立ち上げると
C:\Users\ユーザー名\ (\は¥で表示されていると思います)
で表示されていますので、その後に
cd p
と打ち込み、キーボードの’Tab’を押す度にPから始まるフォルダが表示されていきます。’PycharmProjects’が表示されたらEnterキーを押します。
その後、同様に ’cd フォルダ名’ でプログラムを保存したフォルダに移動します。
もし面倒であったら、プログラムがあるフォルダを開いてアドレスバーを右クリック、アドレスをコピーしてコマンドプロンプトに「cd 」の後にペーストで一気に移動できます。
移動した後に以下のコマンドを実行します。
pyinstaller ファイル名.py --onefile
いかがでしょうか?フォルダ内にbuildとdistというフォルダが作成されdistフォルダの中に、exe化されたファイルがありませんか? これをダブルクリックすることでプログラムが実行されます。
このファイルは、pythonがインストールされていないパソコンでも利用出ることができるので大変便利です。
いかがでしたか?きちんとできましたか?
お疲れ様でした。
今回は、DICOMの匿名化処理のプログラムを作成し、exe化(アプリ化)してみました。
ただ、pythonのバージョンが3.7を使っている方は多分エラーが出てしまっていると思いますので次回その対処法をやっていきたいと思います。