八上 DICOM ツール集 / YAKAMI DICOM Tools ver. 1.0.6.0 Copyright (C) Masahiro YAKAMI 2008. All rights reserved. ================================================================================ DICOM-to-DICOM 変換スクリプトの書き方 ================================================================================ 目次 ● DICOM-to-DICOM 変換スクリプトの書き方 ● 対象の指定の仕方("=" の左側) ● 処理内容の指定の仕方("=" の右側)  ◯ コマンド一覧(ABC 順) ● 付録  ◯ {グループ番号}  ◯ {要素番号}  ◯ {要素形式}  ◯ {VR}  ◯ {データ} ================================================================================ DICOM 変換スクリプトの書き方  DICOM-to-DICOM 変換スクリプトを使用すると DICOM ヘッダを自在に操作することが出 来ます。このスクリプトファイルは、以下のような簡単な書式のテキストファイルです。  このスクリプトファイルの先頭行は、 "dcm_conv opt" で始まります。  2行目以降は、「{対象} = {処理内容}」という形式です。   {対象} には、処理の対象とする要素を指定します。   {処理内容} には、処理する内容を指定します。 例: dcm_conv opt GRP 0010=empty TAG 0008 0080=empty SET private=del ================================================================================ 対象の指定の仕方("=" の左側):  処理の対象とする DICOM 要素(対称要素)は、グループ番号や要素番号やセット名で 指定できます。左辺("=" の左側)は、コマンドとその引数から成ります。コマンド及び 引数は " " (半角スペース)で区切って指定します。コマンドは "GRP" か "TAG" か "SET" です。 例: GRP 0010 GRP 書式:GRP {グループ番号} 説明:{グループ番号} には、 DICOM のグループ番号を 16進数で書きます。例えば以下  のコマンドを指定すると、患者情報のグループに属する全ての要素が処理の対象となり  ます。 例:GRP 0010 TAG 書式:TAG {グループ番号} {要素番号} 説明:{グループ番号} には、 DICOM のグループ番号を 16進数で書き、{要素番号} には  DICOM の要素番号を 16進数で書きます。例えば、TAG 0010 0010 と指定すると、患者  氏名の要素が処理の対象となります。 例:TAG 0010 0010 SET 書式:SET {引数} 説明:今のところ、引数として指定することが出来るのは private だけです。この場合、  private タグが処理の対象とします。 例:SET private ================================================================================ 処理内容の指定の仕方("=" の右側):  処理の内容をコマンドと引数で指定します。コマンドと引数は " " (半角スペース) で区切ります。 例: copy 0010 0010 ======================================== コマンド一覧(ABC 順) add 書式:add {要素形式} {VR} {データ} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、何もしません。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:add 1 LO backslash\20encoded\20string 結果例1:backslash encoded string (対象要素が存在しない場合) 結果例2:original data (対象要素が存在し、その内容が "original data " の場合) copy 書式:copy {グループ番号} {要素番号} 説明:   このコマンドの動作は、対象要素の有無と、 {グループ番号} と {要素番号} で指定  された要素(引数要素)の有無に依ります。  *対象要素が存在する場合、何もしません。  *対象要素が存在せず、引数要素が存在する場合、引数要素を複製し、対称要素として   追加します。  *対象要素が存在せず、引数要素も存在しない場合、何もしません。 指定例:copy 0010 0010 結果例:Myouji Namae ((0010,0010) の内容が "Myouji Namae" の場合) copy_or_add 書式:copy_or_add {グループ番号} {要素番号} {要素形式} {VR} {データ} 説明:   このコマンドの動作は、対象要素の有無と、引数の {グループ番号} と {要素番号}  で指定された要素(引数要素)の有無に依ります。  *対象要素が存在する場合、何もしません。  *対象要素が存在せず、引数要素が存在する場合、引数要素を複製し、対称要素として   追加します。  *対象要素が存在せず、引数要素も存在しない場合、要素形式が {要素形式} で VR が   {VR} でデータ部分が {データ} の要素を作成し、それを対象要素として追加しま   す。 指定例:copy_or_add 0010 0010 1 PN MYOUJI\20NAMAE 結果例1:MYOUJI NAMAE ((0010,0010) も指定されたタグも存在しない場合) 結果例2:Myouji Namae ((0010,0010) の内容が "Myouji Namae" であり、指定されたタグが存在しない場合) 結果例3:myouji namae (指定されたタグが存在し、その内容が "myouji namae" の場合) del 書式:del 説明:   対象要素を削除します。このコマンドには引数は不要です。   対象要素が存在しない場合は何もしません。 指定例:del emptify 書式:emptify 説明:   対象要素を空にします。このコマンドには引数は不要です。   対象要素が存在しない場合は何もしません。 指定例:emptify decrypt 書式:decrypt {パスワード} 説明:   対象要素を、 "encrypt {パスワード}" で処理されていると見なして復号します。   対象要素が存在しない場合は何もしません。 例:decrypt password decrypt_text 書式:decrypt_text {パスワード} 説明:   対象要素を、 "encrypt_text {パスワード}" で処理されていると見なして復号し  ます。   対象要素が存在しない場合は何もしません。 例:decrypt_text password encrypt 書式:encrypt {パスワード} 説明:   対象要素を、{パスワード} で暗号化します。暗号化には DES アルゴリズムを用いま  す。   対象要素が存在しない場合は何もしません。 例:encrypt password encrypt_text 書式:encrypt_text {パスワード} 説明:   対象要素を、{パスワード} で暗号化してからテキスト化します。  暗号化には DES アルゴリズムを用い、テキスト化には base64 を用います。   対象要素が存在しない場合は何もしません。 例:encrypt_text password initial 書式:initial 説明:   対象要素をイニシャル化します。   対象要素が存在しない場合は何もしません。 指定例:initial 結果例:M N (対象要素が存在し、その内容が "MYOUJI NAMAE" の場合) initial_or_add 書式:initial_or_add {要素形式} {VR} {データ} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、対象要素をイニシャル化します。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:initial 1 PN X\20X 結果例1:M N (対象要素が存在し、その内容が "MYOUJI NAMAE" の場合) 結果例2:X X (対象要素が存在しなかった場合) ins_lt 書式:ins_lt {データ} 説明:   {データ} を対象要素の先頭に挿入します。   対象要素が存在しない場合は何もしません。 指定例:ins_lt backslash\20encoded\20string 結果例:backslash encoded stringoriginal data (対象要素が存在し、その内容が "original data " の場合) ins_lt_or_add 書式:ins_lt_or_add {データ} {要素形式} {VR} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、{データ} を対象要素の先頭に挿入します。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:ins_lt_or_add backslash\20encoded\20string 1 LO 結果例1:backslash encoded stringoriginal data (対象要素が存在し、その内容が "original data " の場合) 結果例2:backslash encoded string (対象要素が存在しなかった場合) ins_rt 書式:ins_rt {データ} 説明:   {データ} を対象要素の末尾に挿入します。   対象要素が存在しない場合は何もしません。 指定例:ins_rt backslash\20encoded\20string 結果例:original data backslash encoded string (対象要素が存在し、その内容が "original data " の場合) ins_rt_or_add 書式:ins_rt_or_add {データ} {要素形式} {VR} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、{データ} を対象要素の末尾に挿入します。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:ins_rt_or_add backslash\20encoded\20string 1 LO 結果例1:original data backslash encoded string (対象要素が存在し、その内容が "original data " の場合) 結果例2:backslash encoded string (対象要素が存在しなかった場合) lt_overwrite 書式:lt_overwrite {規定文字列} 説明:   {規定文字列}を対象要素で左詰めで上書きします。   対象要素が存在しない場合は何もしません。 指定例:lt_overwrite ---------- 結果例1:original-- (対象要素が存在し、その内容が "original" の場合) 結果例2:original data (対象要素が存在し、その内容が "original data " の場合) nc 書式:nc 説明:   何もしません。このコマンドには引数は不要です。 指定例:nc overwrite 書式:overwrite {データ} 説明:   対象要素を {データ} で上書きします。   対象要素が存在しない場合は何もしません。 指定例:overwrite backslash\20encoded\20string 結果例1:backslash encoded string (対象要素が存在した場合) overwrite_or_add 書式:overwrite_or_add {データ} {要素形式} {VR} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、対象要素を {データ} で上書きします。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:overwrite_or_add backslash\20encoded\20string 1 LO 結果例:backslash encoded string rsubstring 書式:rsubstring 4 2 説明:   対象要素よりその {開始位置} 番目から {バイト数} バイトを抜き出します。なお、  このコマンドでは、末尾を 0 と数えます。   引数で指定された処理が不可能な場合は内容を空にします。   対象要素が存在しない場合は何もしません。 指定例:rsubstring 4 2 結果例:da (対象要素が存在し、その内容が "original data " の場合) rsubstring_or_add 書式:rsubstring_or_add {開始位置} {バイト数} {要素形式} {VR} {データ} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、対象要素よりその {開始位置} 番目から {バイト数} バイ   トを抜き出します。なお、このコマンドでは、末尾を 0 と数えます。   引数で指定された処理が不可能な場合は内容を空にします。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:rsubstring_or_add 4 2 1 LO backslash\20encoded\20string 結果例1:da (対象要素が存在し、その内容が "original data " の場合) 結果例2:backslash encoded string (対象要素が存在しなかった場合) rt_overwrite 書式:rt_overwrite {規定文字列} 説明:   {規定文字列}を対象要素で右詰めで上書きします。   対象要素が存在しない場合は何もしません。 指定例:rt_overwrite ---------- 結果例1:--original (対象要素が存在し、その内容が "original" の場合) 結果例2:original data (対象要素が存在し、その内容が "original data " の場合) substring 書式:substring {開始位置} {バイト数} 説明:   対象要素よりその {開始位置} 番目から {バイト数} バイトを抜き出します。なお、  このコマンドでは、先頭を 0 と数えます。   引数で指定された処理が不可能な場合は内容を空にします。   対象要素が存在しない場合は何もしません。 指定例:substring 4 2 結果例:in (対象要素が存在し、その内容が "original data " の場合) substring_or_add 書式:substring_or_add {開始位置} {バイト数} {要素形式} {VR} {データ} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、対象要素よりその {開始位置} 番目から {バイト数} バイ   トを抜き出します。なお、このコマンドでは、先頭を 0 と数えます。   引数で指定された処理が不可能な場合は内容を空にします。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:substring_or_add 4 2 1 LO backslash\20encoded\20string 結果例1:in (対象要素が存在し、その内容が "original data " の場合) 結果例2:backslash encoded string (対象要素が存在しなかった場合) trim_end_ins_rt 書式:trim_end_ins_rt {データ} 説明:   対象要素の末尾の空白を除去した上でその後に {データ} を挿入します。   対象要素が存在しない場合は何もしません。 指定例:trim_end_ins_rt backslash\20encoded\20string 結果例:original databackslash encoded string (対象要素が存在し、その内容が "original data " の場合) trim_end_ins_rt_or_add 書式:trim_end_ins_rt_or_add {データ} {要素形式} {VR} 説明:   このコマンドの動作は、対象要素の存在の有無に依ります。  *対象要素が存在する場合、対象要素の末尾の空白を除去した上でその後に {データ}  を挿入します。  *対象要素が存在しない場合、要素形式が {要素形式} で VR が {VR} でデータ部分が   {データ} の要素を作成し、それを対象要素として追加します。 指定例:trim_end_ins_rt_or_add backslash\20encoded\20string 1 LO 結果例1:original databackslash encoded string (対象要素が存在し、その内容が "original data " の場合) 結果例2:backslash encoded string (対象要素が存在しなかった場合) trim_end_rt_overwrite 書式:trim_end_rt_overwrite {規定文字列} 説明:   対象要素の末尾の空白を除去した上でその後に {規定文字列}を対象要素で  右詰めで上書きします。   対象要素が存在しない場合は何もしません。 指定例:trim_end_rt_overwrite ---------- 結果例1:--original (対象要素が存在し、その内容が "original " の場合) 結果例2:original data (対象要素が存在し、その内容が "original data " の場合) ================================================================================ 付録 ● {グループ番号} ● {要素番号} ● {要素形式} ● {VR} ● {データ} ---------------------------------------- {グループ番号}  16進数の整数で指定します。例えば患者情報のグループは 0010 と指定します。 ---------------------------------------- {要素番号}  16進数の整数で指定します。例えば患者IDが入っている要素のタグ番号は 0010 と指定 します。 ---------------------------------------- {要素形式}  DICOM 規格で定められている要素の形式を以下の番号(1,2,3,5,6,7,8)で指定します。 1: VR が explicit で OB か OW か OF か SQ か UT か UN の要素  2バイト:グループ番号  2バイト:要素番号  2バイト:VR  2バイト:00 00  4バイト:内容長  内容長バイト:内容 2: VR が explicit で上記以外の場合の要素  2バイト:グループ番号  2バイト:要素番号  2バイト:VR  2バイト:内容長  内容長バイト:内容 3: implicit VR の要素  2バイト:グループ番号  2バイト:要素番号  4バイト:内容長  内容長バイト:内容 5: explicit VR 固定長入れ子要素  2バイト:グループ番号  2バイト:要素番号  2バイト:VR  2バイト:00 00  4バイト:全体内容長  項目長バイト:項目   :   :  (項目:FF FE E0 00, 4バイトでの項目長, 内容) 6: explicit VR 不定長入れ子要素  2バイト:グループ番号  2バイト:要素番号  2バイト:VR  2バイト:00 00  4バイト:FF FF FF FF  項目長バイト:項目   :   :  (固定長項目:FF FE E0 00, 4byte での項目長, 内容)  (不定長項目:FF FE E0 00 FF FF FF FF, 内容, FF FE E0 0D 00 00 00 00)  4バイト:FF FE E0 DD  4バイト:00 00 00 00 7: implicit VR 固定長入れ子要素  2バイト:グループ番号  2バイト:要素番号  4バイト:全体内容長  要素長バイト:要素   :   :  (要素:FF FE E0 00, 4バイトでの要素長、内容) 8: implicit VR 不定長入れ子要素  2バイト:グループ番号  2バイト:要素番号  4バイト:FF FF FF FF  項目長バイト:項目   :   :  (固定長項目:FF FE E0 00, 4byte での項目長, 内容)  (不定長項目:FF FE E0 00 FF FF FF FF, 内容, FF FE E0 0D 00 00 00 00)  4バイト:FF FE E0 DD  4バイト:00 00 00 00 ---------------------------------------- {VR}  DICOM 規格で定められているを以下の 2文字で指定します。 AE: Application Entity / 応用実体文字列 AS: Age String / 年齢文字列、0-9, 'D', 'W', 'M', 'Y' AT: Attribute Tag / 属性タグ、4バイト符号なし整数(バイナリ) CS: Code String / コード文字列、0-9, ' ', '_' DA: Date / 日付文字列、 0-9, '.' DS: Decimal String / 10進数文字列、0-9, '+', '-', 'E', 'e', '.' DT: Date Time / 日時文字列、 0-9, '+', '-', '.' FL: Floating Point Single / 4バイト実数(バイナリ) FD: Floating Point Double / 8バイト実数(バイナリ) IS: Integer String / 整数文字列、0-9, '+', '-' LO: Long String / 長い文字列 LT: Long Text / 長いテキスト OB: Other Byte String / バイト列 OF: Other Float String / 浮動小数点列 OW: Other Word String / ワード列 PN: Person Name / 人名 SH: Short String / 短い文字列 SL: Signed Long / 符号付きの4バイト整数(バイナリ) SQ: Sequence of Items / 複数項目 SS: Signed Short / 符号付きの2バイト整数(バイナリ) ST: Short Text / 短いテキスト TM: Time / 時間文字列、0-9, '.' UI: Unique Identifier / 識別子(UID)、0-9, '.' UL: Unsigned Long / 符号なしの4バイト整数(バイナリ) UN: Unknown / 不明 US: Unsigned Short / 符号なしの2バイト整数(バイナリ) UT: Unlimited Text / 無制限テキスト ---------------------------------------- {データ}  backslash encoded 形式で指定します。 * \{2桁の16進数} は、指定された値を持つ 1 バイトに置き換わります。 * '\\' は '\' に置き換わります。 * '\NC' は削除されます。 * '\YEAR' は現在の年(例:2008)に置き換わります。 * '\MONTH' は現在の月(例:12)に置き換わります。 * '\MDAY' は現在の日(例:31)に置き換わります。 * '\HOUR' は現在の時間(例:23)に置き換わります。 * '\MIN' は現在の分(例:59)に置き換わります。 * '\SEC' は現在の秒(例:59)に置き換わります。 * '\MSEC' は現在のミリ秒(例:999)に置き換わります。 * '\RND' はランダムな10進数の数字一つ(例:9)に置き換わります。 * '\RNX' はランダムな16進数の数字一つ(例:F)に置き換わります。 * その他の文字は変更されません。 例えば、 "backslash encoded string" というデータは、 "backslash\20encoded\20string" と変換されます。 ---- 文責:八上 全弘 (yakami@kuhp.kyoto-u.ac.jp) 2009/03/09 Copyright (C) Masahiro YAKAMI 2009. All rights reserved.