【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【Linux】DICOMから被験者の情報を一括自動収集

f:id:AIProgrammer:20200430190520p:plain

はじめに

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.csvに保存される。
function get_dcminfo (){
echo \
"$(find $1 -type f  | head -n 1 | xargs -i dcmdump {} \
| grep $2 \
| cut -d [ -f2| cut -d ] -f1),"
}

for k in  $(\ls |sort -n);do
# 被験者フォルダ名
echo $k >> tmp1
# 名前(PatientName)
get_dcminfo $k "PatientName" >> tmp2
# ID(PatientID)
get_dcminfo $k "PatientID" >> tmp3
# 生年月日(PatientBirthDate)
get_dcminfo $k "PatientBirthDate" >> tmp4
# 性別(PatientSex)
get_dcminfo $k "PatientSex" >> tmp5
# 年齢(PatientAge)
get_dcminfo $k "PatientAge" >> tmp6
# 検査日(StudyDate)
get_dcminfo $k "StudyDate" >> tmp7
done

# tmp1, tmp2, tmp3,...tmp7を左詰めでpasteし一つのファイルに
paste tmp* >> dcm_info.csv
# tmpファイルの削除
rm tmp*

まとめ

大量の被験者情報をDICOMから自動で一括収集するプログラムを作成した。 正直、処理の速さとか効率はなにも考えれていない回りくどいかんじだけどコードの中身は単純で理解しやすいのかな? これならHuman Errorも無くなるし時間も有効に使えそう! 特に、AIをやっている人であれば必須のスキルかもしれません。 (過去にKaggleのチャレンジで100万近くのDICOMを相手にしました...)



頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓