DICOM
DICOM Homepage: dicom.nema.org
Python interface pydicom.org
DICOM Beispiel Dateien
DICOM Library: Anonymize, Share, View
University of Iowa: Visible Human
OsiriX® Imagin Software: sample image sets
MATLAB® Central: Example Files
aycan®: samples
stackoverflow: download “.dcm” files for free?

Zugriff auf DICOM Header Daten

Adresse - Name - Typ - Wert

Eine DICOM Datei enthält Attribute. Die Attribute haben eine Adresse, einen Namen, einen Typ und einen Wert. Die Adresse wird als Tag bezeichnet.

Der Typ eines Attributs wird als Value Representation (VR) bezeichnet.
en.wikipedia.org/wiki/DICOM#Value_representations

import dicom
data = dicom.read_file("anonym.dcm")

# Adresse: "0008", "0016"
# Name: "SOP Class UID"
# Type: "UI" (Unique Identifier)
# Wert: "MR Image Storage"

print( data["0008", "0016"] )
# (0008, 0016) SOP Class UID                       UI: MR Image Storage

print( data["0008", "0016"].tag )
# (0008, 0016)

print( data["0008", "0016"].VR )
# UI

print( data["0008", "0016"].value )
# MR Image Storage

print( data.SOPClassUID )
# MR Image Storage

Gruppen

Mehrere Attribute können zu einer Gruppe zusammengefasst werden. Gruppen werden immer zu Gruppen-Listen zusammengefasst, auch wenn diese Gruppen-Listen oftmals nur eine Gruppe enthalten. Gruppen können wiederum Untergruppen-Listen haben, sodass die Attribute auch eine baumstruktur bilden können.
import dicom
data = dicom.read_file("anonym.dcm")

#####################################################################
# Gruppen-Liste mit einem Element:
print( data.ProcedureCodeSequence )
#[
# (0008, 0100) Code Value                          SH: 'XXX'
# (0008, 0102) Coding Scheme Designator            SH: 'RIS99'
# (0008, 0103) Coding Scheme Version               SH: 'V4.6'
# (0008, 0104) Code Meaning                        LO: 'MR Knie re'
# (0008, 010b) Context Group Extension Flag        CS: 'N'
#]

print( data.ProcedureCodeSequence[0].CodeMeaning )
# MR Knie re

#####################################################################
# Gruppen-Liste mit 3 Elementen:
print( data.ReferencedImageSequence )
#[
# (0008, 1150) Referenced SOP Class UID            UI: MR Image Storage
# (0008, 1155) Referenced SOP Instance UID         UI: XXX
# (0008, 1150) Referenced SOP Class UID            UI: MR Image Storage
# (0008, 1155) Referenced SOP Instance UID         UI: XXX
# (0008, 1150) Referenced SOP Class UID            UI: MR Image Storage
# (0008, 1155) Referenced SOP Instance UID         UI: XXX
#]

print( data.ReferencedImageSequence[2] )
# (0008, 1150) Referenced SOP Class UID            UI: MR Image Storage
# (0008, 1155) Referenced SOP Instance UID         UI: XXX

#####################################################################
# Baumstruktur
print( data["2005", "140f"][0].OperatingModeSequence[2] )
# (0018, 9177) Operating Mode Type                 CS: 'GRADIENT'
# (0018, 9178) Operating Mode                      CS: 'IEC_NORMAL'

Bild

Das Bild wird in der DICOM Datei im Attribut "Pixel Data" gespeichert. Die Python Schnittstelle pydicom verpackt die Daten dieses Attributs in einem Numpy-Array.
import dicom
data = dicom.read_file("anonym.dcm")

print( data.PixelArray.__class__ )
# type 'numpy.ndarray'

print( data.PixelArray.shape )
# (512, 512)

print( data.PixelArray.dtype )
# uint16

Anonymisieren einer DICOM Datei

import dicom

data = dicom.read_file("IMG00010")

data.InstanceCreationDate = "XXX"
data.InstanceCreationUID = "XXX"
data.InstanceCreatorUID = "XXX"
data.SOPInstanceUID = "XXX"
data.StudyDate = "XXX"
data.SeriesDate = "XXX"
data.AcquisitionDate = "XXX"
data.ContentDate = "XXX"
data.AccessionNumber = "XXX"
data.Modality = "XXX"
data.InstitutionName = "XXX"
data.InstitutionAddress = "XXX"
data.ReferringPhysiciansName = "XXX"
data.StudyDescription = "XXX"
data.ProcedureCodeSequence[0].CodeValue = "XXX"
data.ReferencedPerformedProcedureStepSequence[0].InstanceCreationDate = "XXX"
data.ReferencedPerformedProcedureStepSequence[0].InstanceCreatorUID = "XXX"
data.ReferencedPerformedProcedureStepSequence[0].ReferencedSOPInstanceUID = "XXX"
data.ReferencedImageSequence[0].ReferencedSOPInstanceUID = "XXX"
data.ReferencedImageSequence[1].ReferencedSOPInstanceUID = "XXX"
data.ReferencedImageSequence[2].ReferencedSOPInstanceUID = "XXX"
data.PatientsName = "XXX"
data.PatientID = "XXX"
data.PatientsBirthDate = "XXX"
data.PatientsSex = "XXX"
data.PatientsAge = "XXX"
data.PatientsWeight = -1 # "XXX" geht nicht wg. Datentyp DS (Decimal String)
data.StudyInstanceUID = "XXX"
data.SeriesInstanceUID = "XXX"
data.StudyID = "XXX"
data.FrameofReferenceUID = "XXX"
data.RequestingPhysician = "XXX"
data.RequestingService = "XXX"
data.RequestedProcedureDescription = "XXX"
data.PerformedProcedureStepStartDate = "XXX"
data.PerformedProcedureStepEndDate = "XXX"
data.PerformedProcedureStepID = "XXX"
data.PerformedStationAETitle = "XXX"
data.RequestAttributesSequence[0].ScheduledProcedureStepID = "XXX"
data.RequestAttributesSequence[0].RequestedProcedureID = "XXX"
data.RequestedProcedureID = "XXX"
data.IssueDateofImagingServiceReque = "XXX"

print data

data.save_as("anonym.dcm")