Package: pydicom-seg
pydicom-segReading and writing ofDICOM-SEGmedical image segmentation storage files usingpydicomas DICOM serialization/deserialization library. For detailed explanations about supported functionality and usage please have a look at thedocumentation.MotivationConverting DICOM-SEG files into ITK compatible data formats, commonly used for
research, is made possible by thedcmqiproject for some time. However, the project is written in C++ and offers only
access to the conversion via the binariesitkimage2segimageandsegimage2itkimage. 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 fornumpyandSimpleITK. Additionally, common use cases like loading
multi-class segmentations are supported out-of-the-box.InstallationInstall from PyPIpipinstallpydicom-segInstall from sourceThis package usesPoetry(version >= 1.0.5) as build system.gitclone\--recurse-submodules\https://github.com/razorx89/pydicom-seg.gitcdpydicom-seg
poetrybuild
pipinstalldist/pydicom_seg-<version>-py3-none-any.whlDevelopmentAfter cloning the repository, please install the gitpre-commithook to
enforce code style and run static code analysis on every git commit.gitclone\--recurse-submodules\https://github.com/razorx89/pydicom-seg.gitcdpydicom-seg
poetryinstall
poetryrunpre-commitinstallGetting StartedLoading binary segmentsimportpydicomimportpydicom_segimportSimpleITKassitkdcm=pydicom.dcmread('segmentation.dcm')reader=pydicom_seg.SegmentReader()result=reader.read(dcm)forsegment_numberinresult.available_segments:image_data=result.segment_data(segment_number)# directly availableimage=result.segment_image(segment_number)# lazy constructionsitk.WriteImage(image,f'/tmp/segmentation-{segment_number}.nrrd',True)Loading a multi-class segmentationdcm=pydicom.dcmread('segmentation.dcm')reader=pydicom_seg.MultiClassReader()result=reader.read(dcm)image_data=result.data# directly availableimage=result.image# lazy constructionsitk.WriteImage(image,'/tmp/segmentation.nrrd',True)Saving a multi-class segmentationPlease generate ametainfo.jsonfor the segments you want to serialize using theweb-based editor from dcmqi.segmentation:SimpleITK.Image=...# A segmentation image with integer data type# and a single component per voxeldicom_series_paths=[...]# Paths to an imaging series related to the segmentationsource_images=[pydicom.dcmread(x,stop_before_pixels=True)forxindicom_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 zerosskip_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')Licensepydicom-segis distributed under theMIT license.