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こんにちは。前回、匿名化ソフトを作りましたがpythonのバージョンが3.7の場合はexe化できたとしてもエラーが出て使えなかったと思います。実は、私の環境も3.7でexe化してもエラーが出て使えませんでした。
いろいろとググってみたのですが、いい解決方法がみつからず結局pyrhonのバージョンを3.6の環境を構築して対策しましたので、その方法を書いてみたいと思います。
そのそも仮想環境とは何なのかということですが、さまざまなライブラリー(numpyとか、openCv等)はいろんなライブラリーと共に使っていくわけなのですが、常に最新のバージョンに対応しているわけではありません。そのため、それぞれのライブラリーがきちんと動くバージョンの環境を構築しなくてはいけません。
今回のexe化もpyinstallerがpython3.7だときちんと動かないのでpython3.6の環境を作ってあげる。それも仮想環境を構築するという事です。
python3.6の環境を構築していきたいと思います。
まず、python3.6のバージョンが入っているか確認してみます。PyCharmを立ち上げて初めの画面の下、構成をクリックして「設定」に入ります。
左メニューの「pythonインタープリタ」を選択後、「プロジェクト・インタープリター」の右側下矢印を押して「追加」をクリック
左「Conda Environment」を選択「pythonのバージョン」をクリックして3.6があるか確認します。
この後はコマンドプロンプトでの作業になります。
コマンドプロンプトを立ち上げ
conda create -n 構築する名前 python = 3.6
のコマンドを打ちます。今回は名前をv3.6、pythonのバージョンを3.6で構築したいので最後にpython = 3.6と付け足します。
途中、anacondaの新しいバージョンがありますよと言われていますが・・・
新しく作る環境内に入るライブラリーが表示されています。pydicomが入っていないのがここで確認できます。環境構築後にインストールしましょう。
これで良ければ「y」を入力しエンターで環境が構築されます。
環境構築が無事に終わりました。新しい環境をアクティブにします。
コマンドは
conda activate 環境名 なので
conda activate v3.6
で新しい環境をアクティブにします。先頭に(v3.6)と入っているので環境がアクティブになっているのが確認できます。
そのまま、pydicomのインストールをしてしまいましょう。
pip install pydicom
でインストールです。
PyCharmに戻って、exe化のプログラムのプロジェクトを開きましょう。
「ファイル」で「設定」をクリック。
左「Conda Environment」を選択「既存の環境」右側の「…」をクリックします。anacondaをインストールしたフォルダから「env」を選択すると先ほど構築した環境名のフォルダがあります。その中の「Tools」「python.exe」を選択します。似たフォルダ「pythonw.exe」というフォルダもあるので間違えないように気を付けてください。
これで、「OK」をクリックして完了です。
前回の、匿名化のプログラムが動かなかった方は前回の記事にそってexe化を試してみてください。きちんと動くプログラムが出来上がっていると思います。
おつかれさまでした。
前回、「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を使っている方は多分エラーが出てしまっていると思いますので次回その対処法をやっていきたいと思います。