DICOM(7)GDCM:dcmファイルを一括して非圧縮に変換する方法

前の関連記事:DICOM(6)Windowsで使える変換ツール:GDCM JPEG2000から変換可


Windows2000の頃まではよく使っていたバッチファイル。GDCMのコマンドラインツールもこれで簡単に使いこなせると思ったら結構手間取ってしまいました。いろいろと大事なことを忘れていました。

バッチファイルにドラッグアンドドロップしてファイルを引数で受ける


まずバッチファイルにドラッグドロップすることでファイル名を引数にします。
echo %1
pause
このBATファイルにdcmファイルを1個ドロップします。


ドロップしたファイルの場所でコマンドが実行され、%1でフルパスが表示されています。

2個のファイルをドロップしても1個目のファイルのフルパスしか表示されません。
echo %1 %2
pause
とするとドロップした2個のファイルのフルパスがともに表示されます。


引数は%1から%9まで受けることができます。逆に行けば9個しか引数を受けれないようです。

DICOMファイルは何百個が1セットなのでこれは困ります。

ということでフォルダをドロップしてみます。


フォルダのフルパスが表示されました。

ファイルかフォルダの判定はバッチファイルでのドラッグ&ドロップ対応 [Win,コマンドプロンプト] - Diary on windに紹介されている方法を使わせていただきます。
echo %~a1|find "d">NUL
if %ERRORLEVEL% EQU 0 (
  echo %~n1はフォルダです。
) else (
  echo %~nx1はファイルです。
)
pause
これでファイルかフォルダかの判定ができました。

フォルダの中のファイルを1個ずつ処理する方法


forを使います。
for %%i in (%1\*.dcm) do ( echo %%i )
pause
これにdcmファイルが5個入ったフォルダをドロップします。


5個とも処理されました。

%%iからファイル名だけを取り出すにはどうしたらよいのでしょう?

 %~nx1で%1からファイル名だけを取り出すことができたので%%iでも同様にしてみます。
for %%i in (%1\*.dcm) do ( echo %%~nxi )
pause

うまくいきました。

同様にして %%~dpiでドライブ文字とパスが得られます。

バッチファイルでgdcmconvを実行させる

for %%i in (%1\*.dcm) do ( gdcmconv -w "%%i" "%%~dpiDec_%%~nxi" )
これでうまくいくと思ったらうまくいきません。

gdcmconvのオプションと引数が理解されていないようです。

なかなか原因がわかりませんでしたが、原因はなんと全角空白が入っていたことでした。

なんとも単純なミスで時間をくってしまいました。

空白を半角にしてフォルダをドロップすると同じフォルダにDec_がファイル名の先頭についた非圧縮ファイルができました。

このバッチファイルにフォルダ判定なども組み込んで完成させます。

圧縮されたDICOMファイルを非圧縮形式にする方法


まずはDICOM(6)Windowsで使える変換ツール:GDCM JPEG2000から変換可のとおりGDCMをインストールします。

パスの設定は「Do not add GDCM to the system PATH」以外を選択しておきます。
@echo off
echo %~a1|find "d">NUL
if %ERRORLEVEL% EQU 0 (
  echo 非圧縮形式に変換中
  for %%i in (%1\*.dcm) do ( gdcmconv -w "%%i" "%%~dpiDec_%%~nxi" )
) else (
  echo ファイルではなくフォルダをドロップしてください。
  pause
)
これを「メモ帳」に入力します。

ファイル→名前をつけて保存。


ファイルの種類を「すべてのファイル」に変更。

ファイル名を「DICOM非圧縮変換.bat」にして保存。

あとは非圧縮にしたいdcmファイルが入ったフォルダをこのDICOM非圧縮変換.batにドラッグアンドドロップするだけです。

コンソール画面が消えると同じフォルダにDec_がファイル名の先頭についた非圧縮ファイルができています。

かなり時間がかかることと、フォルダサイズが何倍にも膨張することに注意が必要です。

Transfer Syntaxを調べる方法


GDCMに含まれるgdcminfoで簡単に調べられます。
@echo off
echo %~a1|find "d">NUL
if %ERRORLEVEL% EQU 0 (
  echo dcmファイルをドロップしてください。
) else (
  gdcminfo %1
)
pause
これをメモ帳に入力して上記と同様にして「DICOM情報.bat」とファイル名をして保存します。

これにdcmファイルをドラッグアンドドロップすればTransfer Syntaxが表示されます。


2行目の

TrasferSyntax is 1.2.840.10008.1.2.4.91 [JPEG 2000 Image Compression]

の部分でJPEG2000形式だとわかります。

太字にした数字部分はunique identifiers (UID)といってDICOMのエンコーディング規則を参照すればこのJPEG2000形式がLosslessではない圧縮であることがわかります。

同じファイルを「DICOM非圧縮変換.bat」で変換後に「DICOM情報.bat」で調べるとExplicit VR Little Endianに変換されていることがわかります。


参考にしたサイト


【Windows】バッチファイルの引数 at softelメモ
ドラッグアンドドロップしたファイル名の修飾方法一覧。

バッチファイルでのドラッグ&ドロップ対応 [Win,コマンドプロンプト] - Diary on wind
ファイルかフォルダの判定方法も載っています。

開発に役立つ,BATファイルの書き方・パターン集 (コマンドプロンプトの定石を体系的に学び,バッチ中級者になろう) - 主に言語とシステム開発に関して
forの使い方などいろいろ載っていますし参考のページも載せてくれています。

DOSプロンプト活用相談室LOG: 文字列の操作
文字列操作のQ&A。

NATIONAL ELECTRICAL MANUFACTURERS ASSOCIATION
DICOM Part 6: Data DictionaryのPage77とPage78にTransfer Syntax一覧があります。

DICOMのエンコーディング規則
Transfer Syntax一覧

次の関連記事:DICOM(8)GDCM:バッチファイルの環境変数の即時展開と遅延展開

PR

0 件のコメント:

コメントを投稿