Skip to main content

Python package for DICOM-SEG medical segmentation file reading and writing

Project description

pydicom-seg

License: MIT Python versions PyPI version DOI

Reading and writing of DICOM-SEG medical image segmentation storage files using pydicom as DICOM serialization/deserialization library. For detailed explanations about supported functionality and usage please have a look at the documentation.

Motivation

Converting DICOM-SEG files into ITK compatible data formats, commonly used for research, is made possible by the dcmqi project for some time. However, the project is written in C++ and offers only access to the conversion via the binaries itkimage2segimage and segimage2itkimage. After a conversion of a DICOM-SEG file to ITK NRRD file format, the user has to scan the output directory for generated files, load them individually and potentially combine multiple files to the desired format.

This library aims to make this process much easier, by providing a Python native implementation of reading and writing functionality with support for numpy and SimpleITK. Additionally, common use cases like loading multi-class segmentations are supported out-of-the-box.

Installation

Install from PyPI

pip install pydicom-seg

Install from source

This package uses Poetry (version >= 1.0.5) as build system.

git clone \
    --recurse-submodules \
    https://github.com/razorx89/pydicom-seg.git
cd pydicom-seg
poetry build
pip install dist/pydicom_seg_rb-<version>-py3-none-any.whl

Development

After cloning the repository, please install the git pre-commit hook to enforce code style and run static code analysis on every git commit.

git clone \
    --recurse-submodules \
    https://github.com/razorx89/pydicom-seg.git
cd pydicom-seg
poetry install
poetry run pre-commit install

Getting Started

Loading binary segments

import pydicom
import pydicom_seg_rb
import SimpleITK as sitk

dcm = pydicom.dcmread('segmentation.dcm')

reader = pydicom_seg_rb.SegmentReader()
result = reader.read(dcm)

for segment_number in result.available_segments:
    image_data = result.segment_data(segment_number)  # directly available
    image = result.segment_image(segment_number)  # lazy construction
    sitk.WriteImage(image, f'/tmp/segmentation-{segment_number}.nrrd', True)

Loading a multi-class segmentation

dcm = pydicom.dcmread('segmentation.dcm')

reader = pydicom_seg_rb.MultiClassReader()
result = reader.read(dcm)

image_data = result.data  # directly available
image = result.image  # lazy construction
sitk.WriteImage(image, '/tmp/segmentation.nrrd', True)

Saving a multi-class segmentation

Please generate a metainfo.json for the segments you want to serialize using the web-based editor from dcmqi.

segmentation: SimpleITK.Image = ...  # A segmentation image with integer data type
                                     # and a single component per voxel
dicom_series_paths = [...]  # Paths to an imaging series related to the segmentation
source_images = [
    pydicom.dcmread(x, stop_before_pixels=True)
    for x in dicom_series_paths
]
template = pydicom_seg_rb.template.from_dcmqi_metainfo('metainfo.json')
writer = pydicom_seg_rb.MultiClassWriter(
    template=template,
    inplane_cropping=False,  # Crop image slices to the minimum bounding box on
                             # x and y axes. Maybe not supported by other frameworks.
    skip_empty_slices=True,  # Don't encode slices with only zeros
    skip_missing_segment=False,  # If a segment definition is missing in the
                                 # template, then raise an error instead of
                                 # skipping it.
)
dcm = writer.write(segmentation, source_images)
dcm.save_as('segmentation.dcm')

License

pydicom-seg is distributed under the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pydicom_seg_rb-1.0.0.tar.gz (21.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pydicom_seg_rb-1.0.0-py3-none-any.whl (25.0 kB view details)

Uploaded Python 3

File details

Details for the file pydicom_seg_rb-1.0.0.tar.gz.

File metadata

  • Download URL: pydicom_seg_rb-1.0.0.tar.gz
  • Upload date:
  • Size: 21.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.13.0 Darwin/24.5.0

File hashes

Hashes for pydicom_seg_rb-1.0.0.tar.gz
Algorithm Hash digest
SHA256 c11a4ecff0f3a6c3487b19d93ae448d4b0f3d1424e9079d939cbb3537e607c41
MD5 dd84c5dc7773a4fb19671538ad7754b3
BLAKE2b-256 00d915c807b0027b079b49a0857fdd5e08c63db9b24a0b6b179d7a98b04ed9a7

See more details on using hashes here.

File details

Details for the file pydicom_seg_rb-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: pydicom_seg_rb-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 25.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.13.0 Darwin/24.5.0

File hashes

Hashes for pydicom_seg_rb-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8e323b1cc1dbb212facd5e8eb5b0787eaa324ca337dfe484bd056035b08acf30
MD5 87b66a763854a6649ee56486ae7c0f1d
BLAKE2b-256 5ed6673a2b986663c3b616d11871236146491ba533c8825516478285ad343e15

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page