Skip to main content

Introduction

pydicomext provides additional functionality to the pydicom Python package which allows reading and saving DICOM files. This module extends pydicom to loading entire directories of DICOM files and organizing the data in terms of patients, studies and series to allow for easy traversal and identification of scans. In addition, pydicomext contains functions to manipulate series, merge two series together and even combine series into a Numpy volume is provided.

If you find this project to be useful in any way, then please let me know via a GitHub issue, email or however!

Installing

Prerequisites

  • Python 3.4+

  • Dependencies:
    • pydicom

Installing pydicomext

pydicomext is currently available on PyPi. The simplest way to install is using pip at the command line:

pip install pydicomext

which installs the latest release. To install the latest code from the repository (usually stable, but may have undocumented changes or bugs):

pip install git+https://github.com/addisonElliott/pydicomext.git

For developers, you can clone the pydicomext repository and run the setup.py file. Use the following commands to get a copy from GitHub and install all dependencies:

git clone pip install git+https://github.com/addisonElliott/pydicomext.git
cd pydicomext
pip install .

or, for the last line, instead use:

pip install -e .

to install in ‘develop’ or ‘editable’ mode, where changes can be made to the local working code and Python will use the updated code.

Test and coverage

Tests are currently non-existent.

Examples

Loading and displaying DICOM directory information

dicomDir = loadDirectory('DICOM DIRECTORY HERE')

print(dicomDir)

Result:

DicomDir
    Patient MF0307_V3
        Name: MF0307
        Issuer of ID:
        Birth Date: 19910613
        Birth Time: None
        Sex: F
        Other IDs:
        Other Names:
        Age: 026Y
        Size: 1.4732
        Weight: 79.3786
        Ethnic Group:
        Comments:
        Identity Removed: NO
        Position: HFS
        Studies:
            Study 1.3.12.2.1107.5.2.50.175614.30000017120515575743500000290
                Date: 20171206
                Time: 121132.400000
                Desc: CCIR-00900^CCIR-00956
                Series:
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000349
                        Date: 20171206
                        Time: 122855.475000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf
                        Number: 10001
                        [18 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000010
                        Date: 20171206
                        Time: 121807.861000
                        Desc: localizer_heart
                        Number: 1001
                        [14 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000388
                        Date: 20171206
                        Time: 122855.577000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf_INTP
                        Number: 11001
                        [25 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000441
                        Date: 20171206
                        Time: 122903.466000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf
                        Number: 12001
                        [18 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000480
                        Date: 20171206
                        Time: 122903.570000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf_INTP
                        Number: 13001
                        [25 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000533
                        Date: 20171206
                        Time: 122911.695000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf
                        Number: 14001
                        [20 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000576
                        Date: 20171206
                        Time: 122911.796000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf_INTP
                        Number: 15001
                        [25 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000629
                        Date: 20171206
                        Time: 122919.754000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf
                        Number: 16001
                        [19 datasets]
                    Series 1.3.12.2.1107.5.2.50.175614.30000017120614415244700000670
                        Date: 20171206
                        Time: 122919.862000
                        Desc: cine_trufi_cs_rt_adapt_trig_10sl_invf_INTP
                        Number: 17001
                        [25 datasets]
                    ...

Combining cMRI scans into a volume

dicomDir = loadDirectory('DICOM DIRECTORY HERE')

# Retrieves the only patient from the directory, throws error if more than one patient
patient = dicomDir.only()

# Retrieves the only study from the patient, throws error if more than one study
study = patient.only()

# Retrieve a list of all series that have the description 'cine_trufi_cs_2_shot'
# Each series is a class pydicomext.Series
# This DICOM directory has multiple series that represent a Z-slice of the heart
# Each series has multiple temporal frames of that slice of the heart at a certain time frame
seriess = list(iter(filter(lambda x: x.description == 'cine_trufi_cs_2_shot', study.values())))

# Merge the series into one, essentially takes datasets from each series and puts into one big series
series = mergeSeries(seriess)

# Combine the series into a Numpy volume
volume = series.combine(methods=[MethodType.StackPosition, MethodType.TemporalPositionIndex])

# Print data of the volume, which is of type pydicomext.Volume
# Can access Numpy array by volume.data
print(volume)

Result:

Volume
    Space: left-posterior-superior
    Orientation: [[-5.80474000e-01  4.44949000e-01 -6.81959360e-01]
        [ 2.95683000e-07  8.37502000e-01  5.46433310e-01]
        [-8.14278000e-01 -3.17191000e-01  4.86148268e-01]]
    Origin: [  30.0193 -150.763   271.145 ]
    Spacing: [1.      1.      1.47266 1.47266]
    Volume shape: (12, 16, 256, 256)

Roadmap & Bugs

  • Create unit tests from local tests

  • Add separate function in Series class that will take a Volume class and apply it to the Series

  • Add a flatten function in Series class that will take a Series and flatten it into one Series.
    • This is useful when combining two multi-frame Series into one. This will merge that into one series.

    • Haven’t thought about it much for what it will do for a standard DICOM.

  • Add a prefaltten function (maybe rename) that will look through a series and get all differences between them.
    • This should exclude basic fields that will change such as slice location, image number, triger time, etc. Or allow some way of deciding what fields to exclude

Pull requests are welcome (and encouraged) for any or all issues!

License

pydicomext has an MIT-based [license](https://github.com/addisonElliott/pydicomext/blob/master/LICENSE>).

Release files for pydicomext 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pydicomext 1.0.0
File Size Uploaded
pydicomext-1.0.0.tar.gz 24.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pydicomext 1.0.0
File Interpreter ABI Platform
pydicomext-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 51.2 kB

Release files / pydicomext-1.0.0.tar.gz

Download URL pydicomext-1.0.0.tar.gz
Size 24.8 kB
Tags Source
SHA-256 checksum
How to use checksums
14c2199423ee8dce4e129e315ea552e3eebaf5ab227a7bc311c5863c2c934d9d
BLAKE2b-256 checksum
How to use checksums
86d701db7014abe776ab58f7782b47c55b132f02796be2f19794be7db9dbaee1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/3.10.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.4

Release files / pydicomext-1.0.0-py3-none-any.whl

Download URL pydicomext-1.0.0-py3-none-any.whl
Size 26.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
10d1f3c35b2efd042b1255fc2195069ad0acaf1d1fbea859a4b38a7bdf22c921
BLAKE2b-256 checksum
How to use checksums
224a660ddee661dc9858b83247669c48147aef5a2ec92b005ed6b7135ac1f45d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/3.10.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.4

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page