医学图像数据格式: DICOM

“具体问题具体分析。” --- 【佚名】

“ 在新领域,始终保持对前人知识体系和成熟技术手段的敬畏和学习。 ”---- 【张立峰 ^ .^】

参考资料:

1.[1] DICOM的常用Tag分类和说明


DICOM (Digital imaging and Communications in Medicine):医学影像成像和通讯标准。

基于 DICOM3.0标准的医学图像中,每一张图像都携带大量信息,可分为四类:

  • Patient
  • Study
  • Series
  • Image

每一项信息都可以用 DICOM TAG 标识,DICOM TAG 由两个十六进制数组成,即(Group, Element)。如(0010, 0010)表示的是 Patient' s name’.

每一项信息被包装成最基本的单元:Data Element(数据元素)。 每一个Data Element 由四部分组成:

  • DICOM TAG: 存储该项信息的标识
  • VR(value representation) :存储描述该项信息的数据类型。
  • value length : 存储描述该项信息的数据长度
  • value: 存储描述该项信息的数据值

1. VR的简单分类

2. DICOM TAG分类和说明

  • Patient Tag

  • Study Tag

  • Series Tag

  • Image Tag

3. 使用 pydicom 读取dicom 文件

in:
import dicom
import pylab
in:
ds = dicom.read_file('P01-0000.dcm') # 加载 dicom 文件
in:
print(ds.dir()) # 打印所有 DICOM TAG 名
out:
['AccessionNumber', 'AcquisitionDate', 'AcquisitionMatrix', 'AcquisitionNumber', 'AcquisitionTime', 'AngioFlag', 'BitsAllocated', 'BitsStored', 'CardiacNumberOfImages', 'Columns', 'ContentDate', 'ContentTime', 'DerivationDescription', 'DeviceSerialNumber', 'EchoNumbers', 'EchoTime', 'EchoTrainLength', 'FlipAngle', 'FrameOfReferenceUID', 'HeartRate', 'HighBit', 'ImageComments', 'ImageOrientationPatient', 'ImagePositionPatient', 'ImageType', 'ImagedNucleus', 'ImagesInAcquisition', 'ImagingFrequency', 'InPlanePhaseEncodingDirection', 'InstanceCreationDate', 'InstanceCreationTime', 'InstanceNumber', 'InstitutionAddress', 'InstitutionName', 'LargestImagePixelValue', 'LargestPixelValueInSeries', 'MRAcquisitionType', 'MagneticFieldStrength', 'Manufacturer', 'ManufacturerModelName', 'Modality', 'NominalInterval', 'NumberOfAverages', 'NumberOfPhaseEncodingSteps', 'PatientAge', 'PatientBirthDate', 'PatientID', 'PatientName', 'PatientPosition', 'PatientSex', 'PatientSize', 'PatientWeight', 'PercentPhaseFieldOfView', 'PercentSampling', 'PerformedProcedureStepDescription', 'PerformedProcedureStepID', 'PerformedProcedureStepStartDate', 'PerformedProcedureStepStartTime', 'PhotometricInterpretation', 'PixelBandwidth', 'PixelData', 'PixelRepresentation', 'PixelSpacing', 'PositionReferenceIndicator', 'ProtocolName', 'ReferringPhysicianName', 'RepetitionTime', 'Rows', 'SAR', 'SOPClassUID', 'SOPInstanceUID', 'SamplesPerPixel', 'ScanOptions', 'ScanningSequence', 'SequenceName', 'SequenceVariant', 'SeriesDate', 'SeriesDescription', 'SeriesInstanceUID', 'SeriesNumber', 'SeriesTime', 'SliceLocation', 'SliceThickness', 'SmallestImagePixelValue', 'SmallestPixelValueInSeries', 'SoftwareVersions', 'SpecificCharacterSet', 'StudyDate', 'StudyDescription', 'StudyID', 'StudyInstanceUID', 'StudyTime', 'TransmitCoilName', 'TriggerTime', 'VariableFlipAngleFlag', 'WindowCenter', 'WindowWidth', 'dBdt']
in:
print(ds.dir('pat')) # 打印包含 'pat' 的 DICOM TAG
out:
['ImageOrientationPatient', 'ImagePositionPatient', 'PatientAge', 'PatientBirthDate', 'PatientID', 'PatientName', 'PatientPosition', 'PatientSex', 'PatientSize', 'PatientWeight']
in:
print(ds.PatientName, ds.PatientSex, ds.PatientSize, ds.PatientWeight ) # 打印 DICOM TAG 相应的属性值
out:
01^AC M 1.72 89
in:
print(ds.data_element('PatientID')) # 打印一个完整的数据元素,包括 DICOMTAG编码值(Group, Element), VR, Value
out:
(0010, 0020) Patient ID       LO: 'AW959532241.111.1212659242'
in:
print(ds.data_element('PatientID').VR, ds.data_element('PatientID').value)
out:
LO       AW959532241.111.1212659242
in:
pixel_bytes = ds.PixelData # 原始二进制文件
pix = ds.pixel_array       # 像素值矩阵
pix
out:
array([[ 88,  86,  84, ...,  28,  41,  50],
       [115, 110, 101, ...,  44,  62,  75],
       [134, 135, 134, ...,  31,  41,  51],
       ...,
       [ 54,  45,  36, ...,  63,  62,  63],
       [ 47,  39,  31, ...,  78,  72,  71],
       [ 40,  34,  26, ...,  96,  83,  77]], dtype=uint16)
in:
pix.shape
out:
(256, 216)
in:
pylab.imshow(pix, cmap=pylab.cm.bone) # cmap 表示 colormap,可以是设置成不同值获得不同显示效果