Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

pydicom

DICOM(医療用デジタル画像通信)ファイルを操作するためのPythonライブラリです。CT・MRI・X線・超音波などの医療画像からピクセルデータやメタデータを読み書き・抽出する際や、DICOMファイルの匿名化・他フォーマットへの変換・圧縮データの処理が必要な場合に使用します。PACS システムや放射線科ワークフロー、医療画像解析アプリケーションの開発に適用できます。

description の原文を見る

Python library for working with DICOM (Digital Imaging and Communications in Medicine) files. Use this skill when reading, writing, or modifying medical imaging data in DICOM format, extracting pixel data from medical images (CT, MRI, X-ray, ultrasound), anonymizing DICOM files, working with DICOM metadata and tags, converting DICOM images to other formats, handling compressed DICOM data, or processing medical imaging datasets. Applies to tasks involving medical image analysis, PACS systems, radiology workflows, and healthcare imaging applications.

SKILL.md 本文

Pydicom

概要

Pydicomは、医療画像データの標準形式であるDICOMファイルを扱うための純粋なPythonパッケージです。このスキルは、ピクセルデータ、メタデータ、および様々な圧縮形式を含む、DICOMファイルの読み込み、書き込み、および操作に関するガイダンスを提供します。

このスキルを使用する場合

以下の作業を行う場合にこのスキルを使用してください:

  • 医療画像ファイル(CT、MRI、X線、超音波、PETなど)
  • メタデータの抽出または変更が必要なDICOMデータセット
  • 医療スキャンからのピクセルデータ抽出と画像処理
  • 研究またはデータ共有のためのDICOM匿名化
  • DICOMファイルを標準的な画像形式に変換
  • 解凍が必要な圧縮DICOMデータ
  • DICOMシーケンスと構造化レポート
  • マルチスライスボリューム再構成
  • PACS(Picture Archiving and Communication System)統合

インストール

pydicomと一般的な依存関係をインストール:

uv pip install pydicom
uv pip install pillow  # For image format conversion
uv pip install numpy   # For pixel array manipulation
uv pip install matplotlib  # For visualization

圧縮されたDICOMファイルを処理する場合、追加のパッケージが必要になる場合があります:

uv pip install pylibjpeg pylibjpeg-libjpeg pylibjpeg-openjpeg  # JPEG compression
uv pip install python-gdcm  # Alternative compression handler

コアワークフロー

DICOMファイルの読み込み

pydicom.dcmread() を使用してDICOMファイルを読み込みます:

import pydicom

# Read a DICOM file
ds = pydicom.dcmread('path/to/file.dcm')

# Access metadata
print(f"Patient Name: {ds.PatientName}")
print(f"Study Date: {ds.StudyDate}")
print(f"Modality: {ds.Modality}")

# Display all elements
print(ds)

重要なポイント:

  • dcmread()Dataset オブジェクトを返します
  • 属性記法(例:ds.PatientName)またはタグ記法(例:ds[0x0010, 0x0010])を使用してデータ要素にアクセスします
  • ds.file_meta を使用してTransfer Syntax UIDなどのファイルメタデータにアクセスします
  • getattr(ds, 'AttributeName', default_value) または hasattr(ds, 'AttributeName') を使用して不足している属性を処理します

ピクセルデータの処理

DICOMファイルから画像データを抽出および操作します:

import pydicom
import numpy as np
import matplotlib.pyplot as plt

# Read DICOM file
ds = pydicom.dcmread('image.dcm')

# Get pixel array (requires numpy)
pixel_array = ds.pixel_array

# Image information
print(f"Shape: {pixel_array.shape}")
print(f"Data type: {pixel_array.dtype}")
print(f"Rows: {ds.Rows}, Columns: {ds.Columns}")

# Apply windowing for display (CT/MRI)
if hasattr(ds, 'WindowCenter') and hasattr(ds, 'WindowWidth'):
    from pydicom.pixel_data_handlers.util import apply_voi_lut
    windowed_image = apply_voi_lut(pixel_array, ds)
else:
    windowed_image = pixel_array

# Display image
plt.imshow(windowed_image, cmap='gray')
plt.title(f"{ds.Modality} - {ds.StudyDescription}")
plt.axis('off')
plt.show()

カラー画像の処理:

# RGB images have shape (rows, columns, 3)
if ds.PhotometricInterpretation == 'RGB':
    rgb_image = ds.pixel_array
    plt.imshow(rgb_image)
elif ds.PhotometricInterpretation == 'YBR_FULL':
    from pydicom.pixel_data_handlers.util import convert_color_space
    rgb_image = convert_color_space(ds.pixel_array, 'YBR_FULL', 'RGB')
    plt.imshow(rgb_image)

マルチフレーム画像(ビデオ/シリーズ):

# For multi-frame DICOM files
if hasattr(ds, 'NumberOfFrames') and ds.NumberOfFrames > 1:
    frames = ds.pixel_array  # Shape: (num_frames, rows, columns)
    print(f"Number of frames: {frames.shape[0]}")

    # Display specific frame
    plt.imshow(frames[0], cmap='gray')

DICOMを画像形式に変換

提供されている dicom_to_image.py スクリプトを使用するか、手動で変換します:

from PIL import Image
import pydicom
import numpy as np

ds = pydicom.dcmread('input.dcm')
pixel_array = ds.pixel_array

# Normalize to 0-255 range
if pixel_array.dtype != np.uint8:
    pixel_array = ((pixel_array - pixel_array.min()) /
                   (pixel_array.max() - pixel_array.min()) * 255).astype(np.uint8)

# Save as PNG
image = Image.fromarray(pixel_array)
image.save('output.png')

スクリプトを使用: python scripts/dicom_to_image.py input.dcm output.png

メタデータの変更

DICOMデータ要素を変更:

import pydicom
from datetime import datetime

ds = pydicom.dcmread('input.dcm')

# Modify existing elements
ds.PatientName = "Doe^John"
ds.StudyDate = datetime.now().strftime('%Y%m%d')
ds.StudyDescription = "Modified Study"

# Add new elements
ds.SeriesNumber = 1
ds.SeriesDescription = "New Series"

# Remove elements
if hasattr(ds, 'PatientComments'):
    delattr(ds, 'PatientComments')
# Or using del
if 'PatientComments' in ds:
    del ds.PatientComments

# Save modified file
ds.save_as('modified.dcm')

DICOMファイルの匿名化

患者の個人識別情報を削除または置換:

import pydicom
from datetime import datetime

ds = pydicom.dcmread('input.dcm')

# Tags commonly containing PHI (Protected Health Information)
tags_to_anonymize = [
    'PatientName', 'PatientID', 'PatientBirthDate',
    'PatientSex', 'PatientAge', 'PatientAddress',
    'InstitutionName', 'InstitutionAddress',
    'ReferringPhysicianName', 'PerformingPhysicianName',
    'OperatorsName', 'StudyDescription', 'SeriesDescription',
]

# Remove or replace sensitive data
for tag in tags_to_anonymize:
    if hasattr(ds, tag):
        if tag in ['PatientName', 'PatientID']:
            setattr(ds, tag, 'ANONYMOUS')
        elif tag == 'PatientBirthDate':
            setattr(ds, tag, '19000101')
        else:
            delattr(ds, tag)

# Update dates to maintain temporal relationships
if hasattr(ds, 'StudyDate'):
    # Shift dates by a random offset
    ds.StudyDate = '20000101'

# Keep pixel data intact
ds.save_as('anonymized.dcm')

提供されているスクリプトを使用: python scripts/anonymize_dicom.py input.dcm output.dcm

DICOMファイルの書き込み

DICOMファイルをゼロから作成:

import pydicom
from pydicom.dataset import Dataset, FileDataset
from datetime import datetime
import numpy as np

# Create file meta information
file_meta = Dataset()
file_meta.MediaStorageSOPClassUID = pydicom.uid.generate_uid()
file_meta.MediaStorageSOPInstanceUID = pydicom.uid.generate_uid()
file_meta.TransferSyntaxUID = pydicom.uid.ExplicitVRLittleEndian

# Create the FileDataset instance
ds = FileDataset('new_dicom.dcm', {}, file_meta=file_meta, preamble=b"\0" * 128)

# Add required DICOM elements
ds.PatientName = "Test^Patient"
ds.PatientID = "123456"
ds.Modality = "CT"
ds.StudyDate = datetime.now().strftime('%Y%m%d')
ds.StudyTime = datetime.now().strftime('%H%M%S')
ds.ContentDate = ds.StudyDate
ds.ContentTime = ds.StudyTime

# Add image-specific elements
ds.SamplesPerPixel = 1
ds.PhotometricInterpretation = "MONOCHROME2"
ds.Rows = 512
ds.Columns = 512
ds.BitsAllocated = 16
ds.BitsStored = 16
ds.HighBit = 15
ds.PixelRepresentation = 0

# Create pixel data
pixel_array = np.random.randint(0, 4096, (512, 512), dtype=np.uint16)
ds.PixelData = pixel_array.tobytes()

# Add required UIDs
ds.SOPClassUID = pydicom.uid.CTImageStorage
ds.SOPInstanceUID = file_meta.MediaStorageSOPInstanceUID
ds.SeriesInstanceUID = pydicom.uid.generate_uid()
ds.StudyInstanceUID = pydicom.uid.generate_uid()

# Save the file
ds.save_as('new_dicom.dcm')

圧縮と解凍

圧縮されたDICOMファイルを処理:

import pydicom

# Read compressed DICOM file
ds = pydicom.dcmread('compressed.dcm')

# Check transfer syntax
print(f"Transfer Syntax: {ds.file_meta.TransferSyntaxUID}")
print(f"Transfer Syntax Name: {ds.file_meta.TransferSyntaxUID.name}")

# Decompress and save as uncompressed
ds.decompress()
ds.save_as('uncompressed.dcm', write_like_original=False)

# Or compress when saving (requires appropriate encoder)
ds_uncompressed = pydicom.dcmread('uncompressed.dcm')
ds_uncompressed.compress(pydicom.uid.JPEGBaseline8Bit)
ds_uncompressed.save_as('compressed_jpeg.dcm')

一般的なTransfer Syntaxes:

  • ExplicitVRLittleEndian - 非圧縮、最も一般的
  • JPEGBaseline8Bit - JPEG非可逆圧縮
  • JPEGLossless - JPEGロスレス圧縮
  • JPEG2000Lossless - JPEG 2000ロスレス
  • RLELossless - ラン長エンコーディングロスレス

完全なリストは references/transfer_syntaxes.md を参照してください。

DICOMシーケンスの処理

ネストされたデータ構造を処理:

import pydicom

ds = pydicom.dcmread('file.dcm')

# Access sequences
if 'ReferencedStudySequence' in ds:
    for item in ds.ReferencedStudySequence:
        print(f"Referenced SOP Instance UID: {item.ReferencedSOPInstanceUID}")

# Create a sequence
from pydicom.sequence import Sequence

sequence_item = Dataset()
sequence_item.ReferencedSOPClassUID = pydicom.uid.CTImageStorage
sequence_item.ReferencedSOPInstanceUID = pydicom.uid.generate_uid()

ds.ReferencedImageSequence = Sequence([sequence_item])

DICOMシリーズの処理

複数の関連するDICOMファイルを処理:

import pydicom
import numpy as np
from pathlib import Path

# Read all DICOM files in a directory
dicom_dir = Path('dicom_series/')
slices = []

for file_path in dicom_dir.glob('*.dcm'):
    ds = pydicom.dcmread(file_path)
    slices.append(ds)

# Sort by slice location or instance number
slices.sort(key=lambda x: float(x.ImagePositionPatient[2]))
# Or: slices.sort(key=lambda x: int(x.InstanceNumber))

# Create 3D volume
volume = np.stack([s.pixel_array for s in slices])
print(f"Volume shape: {volume.shape}")  # (num_slices, rows, columns)

# Get spacing information for proper scaling
pixel_spacing = slices[0].PixelSpacing  # [row_spacing, col_spacing]
slice_thickness = slices[0].SliceThickness
print(f"Voxel size: {pixel_spacing[0]}x{pixel_spacing[1]}x{slice_thickness} mm")

ヘルパースクリプト

このスキルの scripts/ ディレクトリに含まれるユーティリティスクリプト:

anonymize_dicom.py

保護された健康情報(PHI)を削除または置換してDICOMファイルを匿名化します。

python scripts/anonymize_dicom.py input.dcm output.dcm

dicom_to_image.py

DICOMファイルを一般的な画像形式(PNG、JPEG、TIFF)に変換します。

python scripts/dicom_to_image.py input.dcm output.png
python scripts/dicom_to_image.py input.dcm output.jpg --format JPEG

extract_metadata.py

読みやすい形式でDICOMメタデータを抽出および表示します。

python scripts/extract_metadata.py file.dcm
python scripts/extract_metadata.py file.dcm --output metadata.txt

参考資料

詳細な参考情報は references/ ディレクトリで入手できます:

  • common_tags.md: よく使用されるDICOMタグの包括的なリスト(患者、研究、シリーズ、画像など、カテゴリ別に整理)
  • transfer_syntaxes.md: DICOMTransfer Syntaxesと圧縮形式の完全なリファレンス

一般的な問題と解決策

問題:「Unable to decode pixel data」

  • 解決策:追加の圧縮ハンドラをインストール: uv pip install pylibjpeg pylibjpeg-libjpeg python-gdcm

問題:タグにアクセスする際に「AttributeError」

  • 解決策:hasattr(ds, 'AttributeName') で属性の存在を確認するか、ds.get('AttributeName', default) を使用します

問題:画像表示が不正確(暗すぎる/明るすぎる)

  • 解決策:VOI LUTウィンドウイングを適用: apply_voi_lut(pixel_array, ds) または WindowCenterWindowWidth で手動で調整

問題:大規模なシリーズでメモリの問題

  • 解決策:ファイルを反復的に処理、メモリマップ配列を使用、または画像をダウンサンプリング

ベストプラクティス

  1. アクセス前に必ず必須属性を確認 - hasattr() または get() を使用します
  2. ファイルメタデータを保持 - write_like_original=Truesave_as() を使用
  3. Transfer Syntax UIDを使用 - ピクセルデータを処理する前に圧縮形式を理解します
  4. 例外を処理 - 信頼できないソースから読み込むときは例外処理を行います
  5. 適切なウィンドウイング(VOI LUT)を適用 - 医療画像の視覚化に
  6. 空間情報を維持 - 3Dボリューム処理時にピクセルスペーシングとスライス厚を保持
  7. 匿名化を徹底的に検証 - 医療データを共有する前に
  8. UIDを正しく使用 - 新しいインスタンスを作成するときに新しいUIDを生成し、変更時に保持

ドキュメント

公式pydicomeドキュメント: https://pydicom.github.io/pydicom/dev/

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
davila7
リポジトリ
davila7/claude-code-templates
ライセンス
MIT
最終更新
不明

Source: https://github.com/davila7/claude-code-templates / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: davila7 · davila7/claude-code-templates · ライセンス: MIT