In this tutorial we will see examples of how to manipulate images in DICOM files with the pydicom and ImageIO libraries.
Basic documentation on reading, accessing, modifying and writing DICOM files
pydicom
imageio
Libraries and packages
!pip install pydicom
Collecting pydicom
[?25l Downloading https://files.pythonhosted.org/packages/f4/15/df16546bc59bfca390cf072d473fb2c8acd4231636f64356593a63137e55/pydicom-2.1.2-py3-none-any.whl (1.9MB)
[K |████████████████████████████████| 1.9MB 5.4MB/s
[?25hInstalling collected packages: pydicom
Successfully installed pydicom-2.1.2
import numpy as np
import imageio
from pydicom import dcmread
import matplotlib.pyplot as plt
%matplotlib inline
Tutorial
Image sources
YOU DO IT
Download and upload to Colab this DICOM file DICOM
pydicom
Load files
dicom_ds = dcmread("0015.DCM")
Print the list of data elements
print(dicom_ds)
Dataset.file_meta -------------------------------
(0002, 0000) File Meta Information Group Length UL: 202
(0002, 0001) File Meta Information Version OB: b'\x00\x01'
(0002, 0002) Media Storage SOP Class UID UI: X-Ray Radiofluoroscopic Image Storage
(0002, 0003) Media Storage SOP Instance UID UI: 1.2.840.113619.2.15.1008000062035011254.825190719.0.31.2.1
(0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian
(0002, 0012) Implementation Class UID UI: 1.2.840.113619.6.36
(0002, 0013) Implementation Version Name SH: '1_2_5'
(0002, 0016) Source Application Entity Title AE: 'ard-demo'
-------------------------------------------------
(0008, 0005) Specific Character Set CS: 'ISO_IR 100'
(0008, 0008) Image Type CS: ['ORIGINAL', 'PRIMARY', 'SINGLE PLANE']
(0008, 0016) SOP Class UID UI: X-Ray Radiofluoroscopic Image Storage
(0008, 0018) SOP Instance UID UI: 1.2.840.113619.2.15.1008000062035011254.825190719.0.31.2.1
(0008, 0020) Study Date DA: '19960308'
(0008, 0021) Series Date DA: '19960308'
(0008, 0022) Acquisition Date DA: '19960308'
(0008, 0023) Content Date DA: '19960308'
(0008, 0030) Study Time TM: ''
(0008, 0032) Acquisition Time TM: '105650'
(0008, 0033) Content Time TM: '105650'
(0008, 0050) Accession Number SH: ''
(0008, 0060) Modality CS: 'RF'
(0008, 0070) Manufacturer LO: 'GE MEDICAL SYSTEMS'
(0008, 0090) Referring Physician's Name PN: ''
(0008, 1010) Station Name SH: ''
(0008, 1030) Study Description LO: '5'
(0008, 103e) Series Description LO: ''
(0008, 1050) Performing Physician's Name PN: '00558747^'
(0008, 1090) Manufacturer's Model Name LO: 'DRS'
(0010, 0010) Patient's Name PN: 'Rubo DEMO'
(0010, 0020) Patient ID LO: '10-55-87'
(0010, 0030) Patient's Birth Date DA: ''
(0010, 0040) Patient's Sex CS: 'F'
(0010, 1010) Patient's Age AS: ''
(0018, 0060) KVP DS: None
(0018, 1020) Software Versions LO: '4.00'
(0018, 1150) Exposure Time IS: None
(0018, 1151) X-Ray Tube Current IS: None
(0018, 1155) Radiation Setting CS: 'GR'
(0018, 1400) Acquisition Device Processing Descr LO: '10 OUT OF 20. 0=LOW, 20=HIGH CONVOLUTION KERNEL'
(0018, 1600) Shutter Shape CS: ['CIRCULAR', 'RECTANGULAR']
(0018, 1602) Shutter Left Vertical Edge IS: "10"
(0018, 1604) Shutter Right Vertical Edge IS: "950"
(0018, 1606) Shutter Upper Horizontal Edge IS: "10"
(0018, 1608) Shutter Lower Horizontal Edge IS: "950"
(0018, 1610) Center of Circular Shutter IS: [0480, 0480]
(0018, 1612) Radius of Circular Shutter IS: "470"
(0020, 000d) Study Instance UID UI: 1.2.840.113619.2.15.1008000062035011254.825190719.2.31
(0020, 000e) Series Instance UID UI: 1.2.840.113619.2.15.1008000062035011254.825190719.1.31
(0020, 0010) Study ID SH: ''
(0020, 0011) Series Number IS: "1"
(0020, 0013) Instance Number IS: "2"
(0020, 0020) Patient Orientation CS: ''
(0020, 4000) Image Comments LT: 'L1'
(0028, 0002) Samples per Pixel US: 1
(0028, 0004) Photometric Interpretation CS: 'MONOCHROME2'
(0028, 0010) Rows US: 1024
(0028, 0011) Columns US: 1024
(0028, 0100) Bits Allocated US: 8
(0028, 0101) Bits Stored US: 8
(0028, 0102) High Bit US: 7
(0028, 0103) Pixel Representation US: 0
(0028, 1040) Pixel Intensity Relationship CS: 'LIN'
(0028, 1050) Window Center DS: "127.0"
(0028, 1051) Window Width DS: "255.0"
(0028, 2110) Lossy Image Compression CS: '00'
(0028, 6010) Representative Frame Number US: 1
(0028, 6020) Frame Numbers of Interest (FOI) US: 2
(0028, 6022) Frame of Interest Description LO: 'L1'
(0037, 0010) Private Creator LO: 'GEMS_DRS_1'
(0037, 1010) [Refering Department] LO: 'EX 101^'
(0037, 1020) [Screen Number] US: 2
(0037, 1040) [Left Orientation] CS: ''
(0037, 1042) [Right Orientation] CS: ''
(0037, 1050) [Inversion] CS: 'INV_NORMAL'
(0037, 1060) [DSA] CS: ''
(7fe0, 0010) Pixel Data OB: Array of 1048576 elements
Metadata
dicom_ds.file_meta
(0002, 0000) File Meta Information Group Length UL: 202
(0002, 0001) File Meta Information Version OB: b'\x00\x01'
(0002, 0002) Media Storage SOP Class UID UI: X-Ray Radiofluoroscopic Image Storage
(0002, 0003) Media Storage SOP Instance UID UI: 1.2.840.113619.2.15.1008000062035011254.825190719.0.31.2.1
(0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian
(0002, 0012) Implementation Class UID UI: 1.2.840.113619.6.36
(0002, 0013) Implementation Version Name SH: '1_2_5'
(0002, 0016) Source Application Entity Title AE: 'ard-demo'
Accessing elements by tags
dicom_ds[0x0008,0x0016]
(0008, 0016) SOP Class UID UI: X-Ray Radiofluoroscopic Image Storage
Accessing the image array
img_xray = dicom_ds.pixel_array
img_xray.shape
(1024, 1024)
plt.imshow(img_xray, cmap="gray", vmin=0, vmax=255)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f617d2a9da0>
Another example
Example available in documentation.
# authors : Guillaume Lemaitre <g.lemaitre58@gmail.com>
# license : MIT
import matplotlib.pyplot as plt
from pydicom import dcmread
from pydicom.data import get_testdata_file
fpath = get_testdata_file('CT_small.dcm')
ds = dcmread(fpath)
# Normal mode:
print()
print(f"File path........: {fpath}")
print(f"SOP Class........: {ds.SOPClassUID} ({ds.SOPClassUID.name})")
print()
pat_name = ds.PatientName
display_name = pat_name.family_name + ", " + pat_name.given_name
print(f"Patient's Name...: {display_name}")
print(f"Patient ID.......: {ds.PatientID}")
print(f"Modality.........: {ds.Modality}")
print(f"Study Date.......: {ds.StudyDate}")
print(f"Image size.......: {ds.Rows} x {ds.Columns}")
print(f"Pixel Spacing....: {ds.PixelSpacing}")
# use .get() if not sure the item exists, and want a default value if missing
print(f"Slice location...: {ds.get('SliceLocation', '(missing)')}")
# plot the image using matplotlib
plt.imshow(ds.pixel_array, cmap=plt.cm.gray)
plt.show()
File path........: /usr/local/lib/python3.6/dist-packages/pydicom/data/test_files/CT_small.dcm
SOP Class........: 1.2.840.10008.5.1.4.1.1.2 (CT Image Storage)
Patient's Name...: CompressedSamples, CT1
Patient ID.......: 1CT1
Modality.........: CT
Study Date.......: 20040119
Image size.......: 128 x 128
Pixel Spacing....: [0.661468, 0.661468]
Slice location...: -77.2040634155
ImageIO
Load files
im = imageio.imread("0015.DCM")
im.shape
(1024, 1024)
Metadata
im.meta
Dict([('TransferSyntaxUID', '1.2.840.10008.1.2.1'),
('SOPClassUID', '1.2.840.10008.5.1.4.1.1.12.2'),
('SOPInstanceUID',
'1.2.840.113619.2.15.1008000062035011254.825190719.0.31.2.1'),
('StudyDate', '19960308'),
('SeriesDate', '19960308'),
('AcquisitionDate', '19960308'),
('ContentDate', '19960308'),
('StudyTime', ''),
('AcquisitionTime', '105650'),
('ContentTime', '105650'),
('Modality', 'RF'),
('Manufacturer', 'GE MEDICAL SYSTEMS'),
('StudyDescription', '5'),
('SeriesDescription', ''),
('PatientName', 'Rubo DEMO'),
('PatientID', '10-55-87'),
('PatientBirthDate', ''),
('PatientSex', 'F '),
('PatientAge', ''),
('StudyInstanceUID',
'1.2.840.113619.2.15.1008000062035011254.825190719.2.31'),
('SeriesInstanceUID',
'1.2.840.113619.2.15.1008000062035011254.825190719.1.31'),
('SeriesNumber', 1),
('InstanceNumber', 2),
('PatientOrientation', ''),
('SamplesPerPixel', 1),
('Rows', 1024),
('Columns', 1024),
('BitsAllocated', 8),
('BitsStored', 8),
('HighBit', 7),
('PixelRepresentation', 0),
('PixelData',
b'Data converted to numpy array, raw data removed to preserve memory'),
('shape', (1024, 1024)),
('sampling', (1.0, 1.0))])
im.meta["BitsAllocated"]
8
Accessing the image array
im
Array([[46, 49, 46, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0],
...,
[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0]], dtype=uint8)
plt.imshow(im, cmap="gray", vmin=0, vmax=255)
<matplotlib.image.AxesImage at 0x7f617cd37940>