Help us understand the problem. What is going on with this article?

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

はじめに

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に保存される。

get_dcminfo.sh
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を相手にしました...)

Hexans
ガッ、ガッ、ガッ... ブゥプープープー、ブゥプープープー、ブゥプープープー。 ガコッツ... キュコキュコキュコキュコ♪ (MRI画像解析が専門です。 キュリー温度より低いところでないと生きられません。 アイデンティティが消失します。 MRI画像解析以外にもマーケティング解析、速読検定のためのツール、その他便利なツールを作っています。)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした