DCMTK コマンドラインリファレンス は何をしますか?
DCMTKは OFFIS DICOM ツールキット です。DICOM標準の大部分を実装した、成熟したBSDライセンスのリファレンス実装です。このスキルでは、その コマンドラインツール を扱います(C++ APIは対象外です)。
DICOMでやりたいことがあれば、おそらくそれを実現する dcm* バイナリが存在します。ただし、ツールセットは大規模(12モジュール、約70のバイナリ)で、フラグの規則(-x と +x は 異なるフラグ)は独特です。このスキルは、AIエージェントが適切なツールを選択し、初回から正しいコマンドを記述し、DCMTKの典型的な落とし穴を回避できるようにするために存在します。
メンタルモデル
DCMTKはツールを、操作対象に応じてモジュールにグループ化しています:
dcmdata ディスク上のDICOMファイル: 解析、ダンプ、変更、エンコード/デコード(ネットワークなし)
dcmnet TCP上のDIMSE: ECHO、STORE、FIND、MOVE、GET
dcmimage DICOMピクセルデータを一般的な画像形式(PNG/PNM/BMP/TIFF)にレンダリング
dcmjpeg DICOMピクセルデータのJPEG(DCT)圧縮/解凍
dcmjpls DICOMピクセルデータのJPEG-LS圧縮/解凍
dcmsr 構造化レポート: ダンプ、レンダリング、XMLとの相互変換
dcmqrdb 小型のスタンドアロンQ/Rデータベースサーバー(テスト用PACS)+ インデクサー
dcmwlm 小型のスタンドアロンモダリティワークリストサーバー
dcmsign DICOMデジタル署名(署名/検証/削除)
dcmrt 放射線治療オブジェクトの検査(RT Plan / Struct / Dose など)
dcmpstat プレゼンテーションステート + 印刷SCP/SCU(高度; ここでは扱わない)
dcmtls TLSサポート(dcmnetツールで使用; 単独のツールではない)
CLIの命名規則は、一度理解すれば一貫しています:エンコード するツールは dcmc* で始まり(dcmcjpeg、dcmcjpls、dcmcrle)、デコード するツールは dcmd* で始まります(dcmdjpeg、dcmdjpls、dcmdrle)。SCUは *scu(ネットワーククライアント)、SCPは *scp(ネットワークサーバー)で終わります。
DIMSE サービスマップ
サービスクラス 操作 SCUツール SCPツール
─────────────────────────────────────────────────────────────────
検証 C-ECHO echoscu storescp が受け付け
保存 C-STORE storescu, dcmsend storescp, dcmrecv
検索/取得 C-FIND findscu dcmqrscp
C-MOVE movescu dcmqrscp
C-GET getscu dcmqrscp
ワークリスト C-FIND findscu(-W付き) wlmscpfs
実際のPACSを使用する場合は、Orthanc / DCM4CHEE / ConQuest をSCPとして使用します。DCMTK自身のSCP(dcmqrscp、wlmscpfs)はテストおよび統合のためのスキャフォールディング用です。
フラグプレフィックス規則
-x 常に排他的選択(複数のモードから1つを選択)
+x 常に機能をオンにするか、何かを追加する
--x -x または +x の長形式; 同じ意味
したがって、-xe(リトルエンディアンを提案)と +e1(JPEG Baselineをエンコード)は無関係です — 異なるプレフィックス、異なるツールファミリー、異なる意味です。
タスク別ツール一覧
| やりたいこと | ツール | リファレンス |
|---|---|---|
| PACSに到達可能か確認する | echoscu | dcmnet.md |
| DICOMファイルをPACSに送信する | dcmsend(または細かいTS制御が必要ならstorescu) | dcmnet.md |
| DICOMをフォルダに受信する | storescp(またはdcmrecv) | dcmnet.md |
| PACSを検索する(患者ID/日付/受付番号で) | findscu | dcmnet.md |
| PACSからスタディを取得する | movescu または getscu | dcmnet.md |
| DICOMファイルの全タグを表示する | dcmdump | dcmdata.md |
| DICOMファイル内の1つのタグを検索する | dcmdump --search KEY | dcmdata.md |
| タグを匿名化/修正する | dcmodify | dcmdata.md |
| DICOM → JSON 変換 | dcm2json | dcmdata.md |
| DICOM → XML 変換 | dcm2xml | dcmdata.md |
| ファイルが有効なDICOM Part-10かを検証する | dcmftest | dcmdata.md |
| メディア交換用のDICOMDIRを構築する | dcmmkdir(旧エイリアス: dcmgpdir) | dcmdata.md |
| 転送構文を変更する(非圧縮のみ) | dcmconv | dcmdata.md |
| DICOMをJPEGで圧縮する | dcmcjpeg | image-codecs.md |
| JPEGエンコードされたDICOMを解凍する | dcmdjpeg | image-codecs.md |
| JPEG-LSで圧縮/解凍する | dcmcjpls / dcmdjpls | image-codecs.md |
| RLEで圧縮/解凍する | dcmcrle / dcmdrle | dcmdata.md |
| DICOM → PNG/JPEG/TIFF/BMP/PNM にレンダリング | dcm2img | image-codecs.md |
| DICOM画像のリサイズ | dcmscale | image-codecs.md |
| JPEG/PNG/BMP/TIFF をDICOMとしてラップ | img2dcm | img-pdf-import.md |
| PDF(またはCDA/STL/OBJ)をカプセル化DICOMとしてラップ | dcmencap(旧エイリアス: pdf2dcm) | img-pdf-import.md |
| DICOMから埋め込まれたPDF/CDA/STL/OBJを抽出 | dcmdecap(旧エイリアス: dcm2pdf) | img-pdf-import.md |
| 構造化レポートのコンテンツツリーをダンプ | dsrdump | dcmsr.md |
| SR → HTML にレンダリング | dsr2html | dcmsr.md |
| SR を XML と相互変換 | dsr2xml / xml2dsr | dcmsr.md |
| テスト用PACSを立ち上げる | dcmqrscp + dcmqridx | dcmqrdb-wlm.md |
| テスト用モダリティワークリストサーバーを立ち上げる | wlmscpfs | dcmqrdb-wlm.md |
| DICOMデジタル署名の署名/検証 | dcmsign | dcmsign-dcmrt.md |
| RT Plan / Struct / Dose オブジェクトを検査 | drtdump | dcmsign-dcmrt.md |
共通フラグ(ログ、ネットワーク、TLS、転送構文ネゴシエーション、ファイル形式)については common-options.md を参照してください。転送構文UIDと対応する -x* / +t* フラグについては transfer-syntax-uids.md を参照してください。
主要レシピ
以下の例ではこれらのプレースホルダーを使用します — ターゲット環境の実際の値に置き換えてください:
PACS_HOST 相手PACSのホスト名またはIP 例: pacs.hospital.local
PACS_PORT 相手のDICOM TCPポート 例: 104, 4242, 11112
PACS_AET 呼び出されるAEタイトル — 相手の設定と一致する必要がある 例: MAIN_PACS
MY_AET 自分側の呼び出しAEタイトル 例: ACME_SCU
1. PACSに到達可能か確認する(C-ECHO)
echoscu -v PACS_HOST PACS_PORT -aec PACS_AET -aet MY_AET
成功すると Received Echo Response (Success) と表示されます。Association Rejected が表示された場合、相手が -aec のAEタイトルを認識していないか、あなたのIPが相手の設定でホワイトリストに登録されていません。
2. DICOMファイルをPACSに送信する(C-STORE)
単一ファイル、完全なTS制御:
storescu -v PACS_HOST PACS_PORT -aec PACS_AET -aet MY_AET input.dcm
フォルダ、再帰的、成功時にファイル名変更:
dcmsend -v PACS_HOST PACS_PORT -aec PACS_AET -aet MY_AET +sd +r /path/to/studies/
それぞれを使用するタイミング:
storescu— 実績があり、TSネゴシエーションを-x*で完全に制御可能。+sd +r以外に「フォルダをスキャンする」組み込みモードはありません。提案するTSを正確に制御する必要がある場合に使用します。dcmsend— より新しく、シンプルです。ディレクトリスキャン、ステータスサマリー、.done/.badリネームを処理します。既知の相手へのバッチ送信には推奨されるデフォルトです。
一般的な失敗: Association Aborted: presentation context not supported。相手がSOPクラスまたはファイルがエンコードされているTSを受け入れません。-d を付けて実行し、ネゴシエーションを確認してください。提示されたACと受け入れられたACの違いで問題が明らかになります。
3. DICOMをフォルダに受信する(C-STORE SCP)
storescp -v -aet MY_AET --output-directory /path/to/incoming/ \
--sort-conc-studies study_ PACS_PORT
ファイルは /path/to/incoming/study_<StudyInstanceUID>/ の下に到着します。
より柔軟なファイル名テンプレートやスタディごとの後処理フックが必要な場合は、dcmrecv が最新の代替手段です — 同じ考え方で、よりシンプルな設定:
dcmrecv -v --output-directory /path/to/incoming/ PACS_PORT
4. PACSを検索する(C-FIND)
C-FINDクエリは -k キーで構築します: 各 -k は検索を制約するか(-k "(0010,0020)=PATIENT_ID")、その属性を返すように要求します(-k "(0010,0010)" は値なし)。
患者の全スタディ:
findscu -v -S \
-k "(0008,0052)=STUDY" \
-k "(0010,0020)=PATIENT_ID" \
-k "(0010,0010)" \
-k "(0020,000D)" \
-k "(0008,0020)" \
PACS_HOST PACS_PORT -aec PACS_AET -aet MY_AET
知っておくべきフラグ:
-Sスタディルートモデル(デフォルトで最も一般的);-P患者ルート;-Wワークリスト(0008,0052)QueryRetrieveLevel — モデルと一致する必要があります(STUDY/SERIES/IMAGE)- 値を持つ各
-kは制約します。値のない各-k(タグのみ)はSCPにその返却を要求します
5. スタディを取得する(C-MOVE)
C-MOVEは、SCPにインスタンスを宛先AEにプッシュするように要求します。これは、宛先がSCPから到達可能なstorescp/dcmrecvを実行している必要があり、宛先のAEタイトルがSCPに事前登録されている必要があることを意味します。
端末A — ローカルリスナーを起動:
storescp -v --output-directory ./retrieved/ -aet MY_AET 11112
端末B — C-MOVEを発行(宛先 = ポート11112の MY_AET ):
movescu -v -S \
-k "(0008,0052)=STUDY" \
-k "(0020,000D)=1.2.3.4.5.STUDY.UID" \
-aem MY_AET \
PACS_HOST PACS_PORT -aec PACS_AET -aet MY_AET
PACSの設定に MY_AET のエントリがない場合、移動は Move Destination Unknown で失敗します。movescu 自身も --port 11112 --output-directory ./out/ でサブリスナーとして機能できます — 別の storescp 端末を必要としないテストに便利です。
SCPがリスナーについて知る必要がないポイントツーポイント取得には、C-GET(getscu)の方がシンプルです:
getscu -v -S -k "(0008,0052)=STUDY" -k "(0020,000D)=1.2.3.4.5.STUDY.UID" \
--output-directory ./retrieved/ \
PACS_HOST PACS_PORT -aec PACS_AET
ただし、多くの本番PACSはC-GETをサポートしていません — C-MOVEの方が安全なデフォルトです。
6. ファイルからタグをダンプする
ファイル全体、全タグ:
dcmdump input.dcm
1つのタグだけ(名前またはグループ/要素で指定):
dcmdump --search PatientID input.dcm
dcmdump --search "0010,0010" input.dcm
出力は属性ごとに1行:
(0010,0010) PN [DOE^JANE] # 8, 1 PatientName
列: タグ、VR、値、長さ、多重度、属性名。
シーケンスアイテムへの再帰(例: 構造化レポートツリーの読み取り)には +R を追加します。生のピクセルデータのダンプをスキップするには --max-read-length 4 を追加します。dcmdump の出力は dump2dcm でDICOMにパースして戻し、ラウンドトリップ編集が可能です。
7. タグの匿名化/修正
dcmodify はインプレースで修正します(-nb を指定しない限り .bak バックアップを作成):
# 出現するすべての場所のPatientNameを置換(メインセット + 各シーケンスアイテム)
dcmodify -nb -ma "(0010,0010)=ANON^PATIENT" input.dcm
# 存在しなかったタグを挿入
dcmodify -nb -i "(0010,4000)=anonymized 2026-05-25" input.dcm
# すべてのプライベートタグを削除(グループは奇数)
dcmodify -nb -ep input.dcm
# スタディ/シリーズ/インスタンス階層に新しいUIDを生成
dcmodify -nb -gst -gse -gsi input.dcm
操作フラグ(タグごとに排他的):
-i存在しない場合に挿入(存在する場合はエラー)-m存在する場合に修正(存在しない場合はエラー)-maすべてを修正(メインセット + 各シーケンスアイテム)-e消去 /-eaすべて消去 /-epプライベートを消去-gst-gse-gsiStudy/Series/SOPInstance UIDを再生成
注意点: デフォルトでは dcmodify は修正したすべてのファイルの .bak を作成します。10,000ファイルの匿名化では、ディスク使用量が2倍になり、ほぼ常に不要です — バッチ処理では必ず -nb を指定してください。
8. DICOMをPNG/JPEG/TIFF/BMP/PNMにレンダリング
dcm2img +on input.dcm out.png # PNG(8ビット)
dcm2img +on2 input.dcm out.png # PNG(16ビット — 完全なビット深度を保持)
dcm2img +oj input.dcm out.jpg # JPEG(8ビット非可逆ベースライン)
dcm2img +ot input.dcm out.tiff # TIFF
dcm2img +ob input.dcm out.bmp # BMP
dcm2img +op input.dcm out.pgm # PNM raw(グレースケールはPGM、カラーはPPM)
dcm2img のフラグ文字規則: +o<文字> で出力形式を選択します(n=PNG、j=JPEG、t=TIFF、b=BMP、p=PNM/PGM/PPM、l=JPEG-LS)。+oa(--write-auto)は出力ファイル名の拡張子に基づいて形式を選択します。
dcm2img は自動的にJPEG/JPEG-LS/RLE入力を解凍します — 別途 dcmdjpeg の手順は不要です。マルチフレームデータの場合、+Fa はフレームごとに1つの出力ファイルを書き込みます(ファイル名にフレーム番号のサフィックスが付きます)。
ファイルのVOI LUTを使用する代わりにウィンドウイングを制御する必要がある場合:
dcm2img +on +Wm input.dcm out.png # ピクセルの最小/最大をウィンドウとして使用
dcm2img +on +W 50 350 input.dcm out.png # WindowCenter=50, WindowWidth=350
dcm2pnm、dcmj2pnm、dcml2pnm は dcm2img の 非推奨のエイリアス です。