JPG_DICOM変換ソフトの作成

MOに入っているJPEGファイルをDICOMファイルに変換してサーバーに転送しなければなりません
これがなかなか大変な作業でした。個人で趣味でするようなものでは無いのかも。
なお以下の記述については無保証です。

【DICOMファイルの構造】

DICOMファイルの基本的な構造は、1枚の写真が1個のファイルになっており、ファイルの先頭部分に患者情報や画像情報を書き込んだタグがついており、その後に画像データが並んでいる、という構造です。
大きく2種類のタイプがあり、古いタイプではファイルの先頭からいきなりタグが始まりますが、新しいタイプでは先頭128バイトはゼロでその後「DICM」の文字があり、それからタグが始まります。
タグは最初の4バイトがタグの種類を表し、次の4バイトがそのタグの長さを表し、次にデータが並ぶという構造で、これが複数個連なっています。
タグの種類は非常に沢山あって、全てを把握するのは困難です。必要そうなもののみ抜き出して付けるように作成していきました。
DICOMファイルのタグを確認するには、DICOM Toolkitに含まれる dcmdump.exe を使用すればコンソールにダンプされます。また、たいていのDICOMビュワーではタグを表示する画面を持っているのでそこで確認することもできます。

【jpg2dcmの作成】

C言語を使ってコマンドラインプログラムとして作成しました。
画像ファイルとタグファイルを読み込んでDICOMファイルを出力するようにしました。
JPEGファイルの読み込みを自前で作る気力も能力も無いのでSUSIEのプラグインを使います。
input.jpg :画像ファイル
input.txt :タグファイル
output.dcm :作成するDCMファイル
として、コマンドラインで
jpg2dcm input.jpg input.txt output.dcm
と打ち込むとDICOMファイルが作成されます。できるのは無圧縮のDICOMファイルです。
タグファイルは
#検査日付
0008 0020 20001010
#患者名
0010 0010 Patiant_Name
#患者ID
0010 0020 12345
#ImageNumber
0020 0013 001
・・・・・・・・
といった感じでメモ帳などで作成します。

【UIDの作成】

DICOMファイルにはそれぞれにUIDと呼ばれるユニークな文字列をつける必要があります。
サーバーに登録するには以下の3つのUIDが必要です
(0008,0018) SOPインスタンスUID
(0020,000d) 検査インスタンスUID
(0020,000e) シリーズインスタンスUID

UIDとはその画像や検査を一意に表す数字の文字列です。
SOPインスタンスUIDは各画像ごとにユニークである必要があります。
検査インスタンスUIDとシリーズインスタンスUIDは検査/シリーズごとにユニークである必要があります。逆にいうと同じ検査/シリーズの画像には同じUIDを付ける必要があります。
jpg2dcmでDICOMファイルを作成すると自動的に3つのUIDを附加するようになっていますが、その場合画像ごとに全てのUIDがユニークになりますので、検査/シリーズの同じ画像がある場合はタグファイルを使ってUIDを付け直す必要があります。
UIDを作成するルーチンをDICOM Toolkitのソースから抜き出してmakeuid.exeを作成しました。これを使用して必要なUIDを作成します。



【JPEG圧縮ファイルの作成】

無圧縮のままでは画像1枚の大きさが1M近くになりハードディスクを圧迫するのでJPEG圧縮することにします。
DICOM Toolkitに含まれる dcmcjpeg.exe を使用して圧縮します。
DSCF0001.dcmがDICOMファイルとして、コマンドラインで
dcmcjpeg +eb DSCF0001.dcm
と打ち込めば非可逆圧縮JPEGのDICOMファイルができます。
+eb が非可逆圧縮JPEGを作るオプションスイッチです。
圧縮によってファイルサイズは20分の1位になります。


【サーバーへの転送】

DICOM Toolkitに含まれる storescu.exe を使用します。
C:\imageフォルダー内のdscf001b.dcmというlossy JPEG fileを転送してみます

storescu -v -xy --aetitle KPServer --call CONQUESTSRV1 127.0.0.1 5678 C:\image\dscf001b.dcm
と打ち込んで
Requesting Association
Association Accepted (Max Send PDV: 16372)
--------------------------
Sending file: C:\image\dscf001b.dcm
Transfer: JPEGBaseline -> JPEGBaseline
Store SCU RQ: MsgID 1, (SC)
XMIT:......
C-Store RSP: MsgID: 1 [Status=Success]
AffectedSOPClassUID: =SecondaryCaptureImageStorage
AffectedSOPInstanceUID: 1.2.276.0.7230010.3.1.4.955511733.1056.1146343570.1
Data Set: Not Present
Releasing Association
などと返って来ればOK、転送完了です。細かい表示内容は転送するファイルによって異なります。




【jpgsendの作成】

コマンドラインプログラムだけでは操作が面倒で使い物にならないので、一連の操作を自動実行するGUIプログラムをVBを使って作成しました。
このプログラムが行うことは、MOや作業用のディレクトリを記憶しておき、MO内のデータがなくなるまで上の一連の操作を繰り返し実行することです。
これを使用すれば、上に書いたようなことは全く意識せずに、MOをドライブに挿入し、ボタンを押すだけで後は自動的に変換し転送してくれます


【作成したソフト】

もし使ってみたいという方がいらっしゃるならこちらからどうぞ、なお動作保証はしません。
jpg2dcm.zip(コマンドラインプログラム)
jpgsend_setup.zip(VBプログラム)




上に戻る


2007/1/8