Giter Club home page Giter Club logo

pydicom-seg's Introduction

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-<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
import SimpleITK as sitk

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

reader = pydicom_seg.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.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.template.from_dcmqi_metainfo('metainfo.json')
writer = pydicom_seg.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.

pydicom-seg's People

Contributors

razorx89 avatar leonhardfeiner avatar coertmetz avatar jpeoples avatar vanossj avatar kirbyju avatar jmgo avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.