Communitygithub.com

DCMTK コマンドラインリファレンス

DICOMツールキットDCMTKのCLIツールを網羅したリファレンス。AIエージェントが適切なツールを選択し、正しいコマンドを初回から実行できるように設計されています。

DCMTK コマンドラインリファレンス とは?

このスキルは、OFFIS DICOM Toolkit(DCMTK)のコマンドラインツールに関する包括的なリファレンスを提供します。DCMTKは、DICOM標準の主要部分を実装した成熟したBSDライセンスのツールキットであり、約70のバイナリが12のモジュールにわたって提供されています。このスキルの目的は、AIエージェントがDICOM関連のタスクに適切なツールを選択し、正しいフラグ構成でコマンドを初回から実行できるようにすることです。特に、DCMTK独自のフラグ規約(`-x`と`+x`は異なる意味を持つ)や、モジュールごとのツール体系を解説し、よくある落とし穴を回避するための実践的な知識を提供します。Claude Code、Cursor、CodexなどのAIエージェントがDICOMファイルの解析、変換、ネットワーク通信、匿名化などの作業を効率的に行うために設計されています。

対応~Claude Code~Codex CLI~Cursor
npx skills add Lightbridge-KS/agent-skills

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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に到達可能か確認するechoscudcmnet.md
DICOMファイルをPACSに送信するdcmsend(または細かいTS制御が必要ならstorescu)dcmnet.md
DICOMをフォルダに受信するstorescp(またはdcmrecv)dcmnet.md
PACSを検索する(患者ID/日付/受付番号で)findscudcmnet.md
PACSからスタディを取得するmovescu または getscudcmnet.md
DICOMファイルの全タグを表示するdcmdumpdcmdata.md
DICOMファイル内の1つのタグを検索するdcmdump --search KEYdcmdata.md
タグを匿名化/修正するdcmodifydcmdata.md
DICOM → JSON 変換dcm2jsondcmdata.md
DICOM → XML 変換dcm2xmldcmdata.md
ファイルが有効なDICOM Part-10かを検証するdcmftestdcmdata.md
メディア交換用のDICOMDIRを構築するdcmmkdir(旧エイリアス: dcmgpdir)dcmdata.md
転送構文を変更する(非圧縮のみ)dcmconvdcmdata.md
DICOMをJPEGで圧縮するdcmcjpegimage-codecs.md
JPEGエンコードされたDICOMを解凍するdcmdjpegimage-codecs.md
JPEG-LSで圧縮/解凍するdcmcjpls / dcmdjplsimage-codecs.md
RLEで圧縮/解凍するdcmcrle / dcmdrledcmdata.md
DICOM → PNG/JPEG/TIFF/BMP/PNM にレンダリングdcm2imgimage-codecs.md
DICOM画像のリサイズdcmscaleimage-codecs.md
JPEG/PNG/BMP/TIFF をDICOMとしてラップimg2dcmimg-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
構造化レポートのコンテンツツリーをダンプdsrdumpdcmsr.md
SR → HTML にレンダリングdsr2htmldcmsr.md
SR を XML と相互変換dsr2xml / xml2dsrdcmsr.md
テスト用PACSを立ち上げるdcmqrscp + dcmqridxdcmqrdb-wlm.md
テスト用モダリティワークリストサーバーを立ち上げるwlmscpfsdcmqrdb-wlm.md
DICOMデジタル署名の署名/検証dcmsigndcmsign-dcmrt.md
RT Plan / Struct / Dose オブジェクトを検査drtdumpdcmsign-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 -gsi Study/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 の 非推奨のエイリアス です。

関連スキル