pydicom について
DICOMファイルを扱うPython開発者や医用画像チーム向けのスキルです。メタデータとピクセルデータの参照、DICOM規則への対応、プライバシーに配慮した処理方法を説明します。
主な機能
- 01名前またはIDでタグにアクセス
- 02pixel_arrayでピクセルデータを取得
- 03型付きDICOM値の処理
- 04DICOMシリーズの処理
- 05患者識別情報の匿名化
活用シーン
- 01患者情報と検査メタデータの抽出
- 02CTやMRIの画素データを解析用に準備
- 03解析用のDICOMデータ変換
- 04医用画像データの品質確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ tondevrel/ scientific-agent-skills --skill pydicomインストール後、Claude Code で/pydicomを入力して読み込まれたか確認します。
詳細
Pydicom - 医療画像規格
DICOMは単なる画像ではありません。患者情報、空間的な向き、ピクセルデータを含む豊富なデータ構造です。Pydicomを使うと、これらすべてのタグにアクセスできます。
使用する場面
- 医療画像データ(CT、MRI、X線、超音波)の処理。
- DICOMファイルから患者のメタデータや臨床情報を抽出する場合。
- 画像とメタデータの両方を必要とする放射線医学向けAIモデルの構築。
- 分析用にDICOMをほかの形式へ変換する場合。
- 医療画像ワークフローにおける品質保証とコンプライアンスの確認。
基本原則
データセットは辞書形式
タグには名前(例:ds.PatientName)またはID(ds[0x0010, 0x0010])でアクセスします。
ピクセルデータ
生のピクセルデータはPixelDataに格納されていますが、NumPyとの連携にはpixel_arrayを使用してください。
VR(値表現)
日付、年齢、小数値を厳密に型指定することで、データの整合性を確保できます。
クイックリファレンス
標準的なインポート
import pydicom
from pydicom.data import get_testdata_files
import matplotlib.pyplot as plt
import numpy as np
基本パターン
# 1. Read file
ds = pydicom.dcmread("scan.dcm")
# 2. Access Metadata
print(f"Patient: {ds.PatientName}, ID: {ds.PatientID}")
print(f"Modality: {ds.Modality}") # CT, MR, DX
print(f"Study Date: {ds.StudyDate}")
print(f"Slice Thickness: {ds.SliceThickness}")
# 3. Access Image
plt.imshow(ds.pixel_array, cmap="gray")
plt.title(f"{ds.Modality} - {ds.PatientName}")
重要なルール
✅ 推奨事項
- pixel_arrayプロパティを使用する - NumPyと適切に連携できるよう、ピクセルデータには
ds.PixelDataではなく、常にds.pixel_arrayでアクセスしてください。 - タグの欠落を確認する - 省略可能なタグにアクセスする前に、
hasattr(ds, 'TagName')を使用してください。 - 患者のプライバシーを尊重する - DICOMファイルにはPHI(保護対象医療情報)が含まれています。共有する前に必ず匿名化してください。
- さまざまな測光解釈に対応する - 画像によっては反転していたり、異なる色空間を使用していたりします。
❌ 禁止事項
- DICOMファイルを上書き編集しない - 元のデータを保持するため、変更する際は必ずコピーを作成してください。
- VRの型を無視しない - DICOMではデータ型が厳密に定められています。誤った変換はデータを破損させるおそれがあります。
- すべてのDICOMファイルに画像が含まれると思い込まない - メタデータのみを含むもの(構造化レポート)もあります。
応用パターン
DICOMシリーズの操作
import pydicom
from pathlib import Path
# Load a series of DICOM files
dicom_dir = Path("dicom_series")
files = sorted(dicom_dir.glob("*.dcm"))
# Load and stack slices
slices = [pydicom.dcmread(f) for f in files]
volume = np.stack([s.pixel_array for s in slices])
匿名化
# Remove patient identifiers
ds.PatientName = "ANONYMOUS"
ds.PatientID = "000000"
ds.PatientBirthDate = ""
ds.PatientSex = ""
PydicomはPythonにおける医療画像処理の基盤であり、現代の放射線医学を支える、豊富で標準化されたDICOM形式を研究者や臨床医が扱えるようにします。
コメント
Markdown 対応