pydicom is a pure Python package for working with DICOM files. It lets you read, modify and write DICOM data in an easy "pythonic" way. As a pure Python package, pydicom can run anywhere Python runs without any other requirements, although if you're working with Pixel Data then we recommend you also install NumPy.
Note that pydicom is a general-purpose DICOM framework concerned with reading and writing DICOM datasets. In order to keep the project manageable, it does not handle the specifics of individual SOP classes or other aspects of DICOM. Other libraries both inside and outside the pydicom organization are based on pydicom and provide support for other aspects of DICOM, and for more specific applications.
Examples are pynetdicom, which is a Python library for DICOM networking, and deid, which supports the anonymization of DICOM files.
Using pip:
pip install pydicom
Using conda:
conda install -c conda-forge pydicom
For more information, including installation instructions for the development version, see the installation guide.
The pydicom user guide, tutorials, examples and API reference documentation is available for both the current release and the development version on GitHub Pages.
Compressed and uncompressed Pixel Data is always available to be read, changed and written as bytes:
>>> from pydicom import dcmread
>>> from pydicom.data import get_testdata_file
>>> path = get_testdata_file("CT_small.dcm")
>>> ds = dcmread(path)
>>> type(ds.PixelData)
<class 'bytes'>
>>> len(ds.PixelData)
32768
>>> ds.PixelData[:2]
b'\xaf\x00'
If NumPy is installed, Pixel Data can be converted to an ndarray using the Dataset.pixel_array property:
>>> arr = ds.pixel_array
>>> arr.shape
(128, 128)
>>> arr
array([[175, 180, 166, ..., 203, 207, 216],
[186, 183, 157, ..., 181, 190, 239],
[184, 180, 171, ..., 152, 164, 235],
...,
[906, 910, 923, ..., 922, 929, 927],
[914, 954, 938, ..., 942, 925, 905],
[959, 955, 916, ..., 911, 904, 909]], dtype=int16)
Converting JPEG, JPEG-LS or JPEG 2000 compressed Pixel Data to an ndarray
requires installing one or more additional Python libraries. For information on which libraries are required, see the pixel data handler documentation.
Decompressing RLE Pixel Data only requires NumPy, however it can be quite slow. You may want to consider installing one or more additional Python libraries to speed up the process.
Information on compressing Pixel Data using one of the below formats can be found in the corresponding encoding guides. These guides cover the specific requirements for each encoding method and we recommend you be familiar with them when performing image compression.
Compressing image data from an ndarray
or bytes
object to JPEG-LS or JPEG 2000 requires installing the following:
- JPEG-LS requires pyjpegls
- JPEG 2000 requires pylibjpeg and the pylibjpeg-openjpeg plugin
Compressing using RLE requires no additional packages but can be quite slow. It can be sped up by installing pylibjpeg with the pylibjpeg-rle plugin, or gdcm.
More examples are available in the documentation.
Change a patient's ID
from pydicom import dcmread
ds = dcmread("/path/to/file.dcm")
# Edit the (0010,0020) 'Patient ID' element
ds.PatientID = "12345678"
ds.save_as("/path/to/file_updated.dcm")
Display the Pixel Data
With NumPy and matplotlib
import matplotlib.pyplot as plt
from pydicom import dcmread, examples
# The path to the example "ct" dataset included with pydicom
path: "pathlib.Path" = examples.get_path("ct")
ds = dcmread(path)
# `arr` is a numpy.ndarray
arr = ds.pixel_array
plt.imshow(arr, cmap="gray")
plt.show()
We are all volunteers working on pydicom in our free time. As our resources are limited, we very much value your contributions, be it bug fixes, new core features, or documentation improvements. For more information, please read our contribution guide.