1. 目的
PythonのPydicomライブラリを用いて、DICOMヘッダーをCSVにまとめて保存
2. 準備
2.1. ライブラリの準備
Pydicomは、DICOMのヘッダーや画像を操作するのに用いるライブラリである。
Pydicomのインストールは、以下のコマンドを実行。
1 | pip3 install pydicom |
CSV形式の表データを扱うには、Pandasライブラリを用いる。
Pandasライブラリのインストールは、以下のコマンドを実行。
1 | pip3 install pandas |
2.2. データの準備
次のような、フォルダ構造でデータを準備する。この場合では、各被験者フォルダの中にDICOMが保存されている。
01 02 03 04 05 06 07 08 09 10 11 | DICOM_folder ├── Subject001 │ ├── XXX.dcm │ ├── ... │ └── XXX.dcm ├── Subject002 │ ├── XXX.dcm │ ├── ... │ └── XXX.dcm ├── ... └── SubjectXXX |
2.3. スクリプトの準備
次のコードを、extract_dcm_header.py
として保存する。このとき、スクリプトはDICOM_folder
フォルダと同じ階層に保存する。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import os import pydicom import pandas as pd input = 'DICOM_folder' # Input folder output = 'dicom_headers.csv' # Output CSV dcm_dfs = [] failed_files = [] processed_files = [] for root, _, files in os.walk( input ): # Find DICOM file for each subject if len (files) ! = 0 : # If DICOM files exist try : f = os.path.join(root, files[ 0 ]) dcm = pydicom.dcmread(f) # Read DICOM _df = pd.DataFrame({dcm[k].keyword: [dcm[k].value] for k in dcm.keys() if dcm[k].keyword ! = "PixelData" }) # Read Headers dcm_dfs.append(_df) # Gather headers of all subjects in a list processed_files.append(f) except : failed_files.append(f) dcm_dfs = pd.concat(dcm_dfs, ignore_index = True ) # Concat headers of all subjects in a table dcm_dfs.to_csv(output, index = False ) # Save as CSV |
3. プログラムの実行
2.3. スクリプトの準備で用意した、extract_dcm_header.py
を実行するには、次のコマンドを実行する。
1 | python3 . /extract_dcm_header .py |
4. 結果の確認
収集したDICOMヘッダーは、dicom_headers.csv
として保存される。
5. コードの解説
まず、必要なライブラリを読み込む。
1 2 3 | import os import pydicom import pandas as pd |
ここでは、入力となるDICOMフォルダーと出力となるDICOMヘッダーのまとまったCSVの名前を定義している。
今回の場合だとinput='DICOM_folder'
、output='dicom_headers.csv'
。
1 2 | input = 'DICOM_folder' # Input folder output = 'dicom_headers.csv' # Output CSV |
データを格納するための、箱(リスト)を定義。
1 2 3 | dcm_dfs = [] failed_files = [] processed_files = [] |
被験者ごとのDICOMファイルを検索。
1 | for root, _, files in os.walk( input ): # Find DICOM file for each subject |
DICOMファイルがある場合のみ、処理を実行。
1 | if len (files) ! = 0 : # If DICOM files exist |
Pydicomを用いて、DICOMデータを読み込む。
1 2 3 | try : f = os.path.join(root, files[ 0 ]) dcm = pydicom.dcmread(f) # Read DICOM |
DICOMからヘッダー(Header)情報を、Pandasで読み込む。
PixelData
タグを含めると、出力(CSV)が崩れておかしくなるので、収集に含めないようにしている。
1 | _df = pd.DataFrame({dcm[k].keyword: [dcm[k].value] for k in dcm.keys() if dcm[k].keyword ! = "PixelData" }) # Read Headers |
収集した結果を、被験者ごとに処理をして、一つの箱(リスト)にまとめる。
1 2 3 4 | dcm_dfs.append(_df) # Gather headers of all subjects in a list processed_files.append(f) except : failed_files.append(f) |
すべての被験者のヘッダー情報を、一つの表形式のデータ(DataFrame
型)に変換する。
1 | dcm_dfs = pd.concat(dcm_dfs, ignore_index = True ) # Concat headers of all subjects in a table |
結果を、CSVとして保存する。
1 | dcm_dfs.to_csv(output, index = False ) # Save as CSV |