はじめに
200件ちかいMRIのDICOMから被験者の
- 名前
- ID
- 生年月日
- 性別
- 年齢
- 検査日
を表にまとめる。
手作業では、いつまで経っても終わらないのとコピペのミス等のHuman Errorが出る可能性があるのでPCにまかせるプログラムを作成した。
dcmdumpを使うととても便利。
作業環境
$ cat /etc/os-release
NAME="Ubuntu"VERSION="18.04.4 LTS (Bionic Beaver)"ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"VERSION_ID="18.04"HOME_URL="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
dcmdump
DICOMのヘッダー情報を吐き出すことができる。
インストール
$ apt-get install dcmtk
使い方
使い方は、dcmdumpのあとにDICOM fileを指定するだけです。
タグごとに情報が吐き出されます。
$ dcmdump <DICOM file>
準備
フォルダ構造はこのような感じ。
200人分のフォルダがあり、それぞれの中に複数の画像が入っている。
$tree.├── 1
│ ├── Tensor_diffusion_30dir_4mm_DFC_MIX - 10
│ │ ├── IM-0001-0001-0001.dcm
│ │ ├── IM-0001-0002-0001.dcm
│ │ ├── IM-0001-0003-0001.dcm
・
・
・
│ │ └── IM-0001-0062-0001.dcm
│ └── t1_mprage_sag_p2_iso - 9
│ ├── IM-0001-0001-0001.dcm
│ ├── IM-0001-0002-0001.dcm
│ ├── IM-0001-0003-0001.dcm
・
・
・
│ └── IM-0001-0176-0001.dcm
├── 2
・
・
・
└── 200
実行
大人の事情でヘッダーの吐き出しているところを実際に見せられませんが雰囲気を掴んで貰えれば幸いです(汗)。
1. 被験者一人ひとりのフォルダ名が1,2,3,・・・200となっていたので"ls |sort -n" で1,2,3,・・・100,・・・200とリスト化して変数kに順次代入。(仮に"ls"のみだと1,100,200,・・・99と頭の数字順にsortされる)
2. 各被験者ごとに大量のDICOMがあるがどれか一つでもあれば情報は取得できる。ということで、"find <被験者フォルダ> -type f(ファイルのみ探す) | head -n 1"をつかって各被験者ごとに1枚DICOMを取り出す。
3. 2.で得られたDICOMファイルのパス・ファイル名をもとに、"dcmdump"でヘッダー吐き出し
4. 3.のうち必要なものだけをとりだす(grep <必要なタグ>)。
5. それぞれのタグは(tag ID) tag type [tag info] tag nameからなる。ほしいのは [tag info]なので"[]"の中身をとりだすようにして”cut -d [ -f2| cut -d ] -f1”を使う。
6. それぞれのほしいタグごとにtmp?にリダイレクトし最後にpasteでまとめる。
7. tmp?ファイルは必要ないので削除(汚物は除去)。
8. 1列目に被験者フォルダ名、続いて名前、ID、生年月日、性別、年齢、検査日がまとまったテキストがdcm_info.txtに保存される。
for k in$(\ls |sort -n);do# 被験者フォルダ名echo$k>> tmp1
# 名前(PatientName)
find $k-type f | head-n 1 | xargs -i dcmdump {}\
| grep PatientName \
| cut-d[-f2| cut-d]-f1>> tmp2
# ID(PatientID)
find $k-type f | head-n 1 | xargs -i dcmdump {}\
| grep PatientID \
| cut-d[-f2| cut-d]-f1>> tmp3
# 生年月日(PatientBirthDate)
find $k-type f | head-n 1 | xargs -i dcmdump {}\
| grep PatientBirthDate \
| cut-d[-f2| cut-d]-f1>> tmp4
# 性別(PatientSex)
find $k-type f | head-n 1 | xargs -i dcmdump {}\
| grep PatientSex \
| cut-d[-f2| cut-d]-f1>> tmp5
# 年齢(PatientAge)
find $k-type f | head-n 1 | xargs -i dcmdump {}\
| grep PatientAge \
| cut-d[-f2| cut-d]-f1>> tmp6
# 検査日(PerformedProcedureStepStartDate)
find $k-type f | head-n 1 | xargs -i dcmdump {}\
| grep PerformedProcedureStepStartDate \
| cut-d[-f2| cut-d]-f1>> tmp7
done# tmp1, tmp2, tmp3,...tmp7を左詰めでpasteし一つのファイルにpaste tmp*>> dcm_info.txt
# tmpファイルの削除rm tmp*
まとめ
大量の被験者情報をDICOMから自動で一括収集するプログラムを作成した。
正直、処理の速さとか効率はなにも考えれていない回りくどいかんじだけどコードの中身は単純で理解しやすいのかな?
これならHuman Errorも無くなるし時間も有効に使えそう!
特に、AIをやっている人であれば必須のスキルかもしれません。
(過去にKaggleのチャレンジで100万近くのDICOMを相手にしました...)