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