【Python】DICOMヘッダーをCSVに保存

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

コメントを残す

This site uses Akismet to reduce spam. Learn how your comment data is processed.