%global _empty_manifest_terminate_build 0 Name: python-pydicom-seg Version: 0.4.1 Release: 1 Summary: Python package for DICOM-SEG medical segmentation file reading and writing License: MIT URL: https://github.com/razorx89/pydicom-seg Source0: https://mirrors.aliyun.com/pypi/web/packages/66/12/b6cf4dbeb111e515cbec834a7ee6f6b8da9a7a8d4962cc2b31adfc7adad5/pydicom-seg-0.4.1.tar.gz BuildArch: noarch Requires: python3-pydicom Requires: python3-SimpleITK Requires: python3-numpy Requires: python3-jsonschema %description # pydicom-seg [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Python versions](https://img.shields.io/pypi/pyversions/pydicom-seg.svg)](https://img.shields.io/pypi/pyversions/pydicom-seg.svg) [![PyPI version](https://badge.fury.io/py/pydicom-seg.svg)](https://badge.fury.io/py/pydicom-seg) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3597420.svg)](https://doi.org/10.5281/zenodo.3597420) Reading and writing of [DICOM-SEG](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.8.20.html) medical image segmentation storage files using [pydicom](https://github.com/pydicom/pydicom) as DICOM serialization/deserialization library. For detailed explanations about supported functionality and usage please have a look at the [documentation](https://razorx89.github.io/pydicom-seg). ## Motivation Converting DICOM-SEG files into ITK compatible data formats, commonly used for research, is made possible by the [dcmqi](https://github.com/QIICR/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 ```bash pip install pydicom-seg ``` ### Install from source This package uses [Poetry](https://python-poetry.org/) (version >= 1.0.5) as build system. ```bash git clone \ --recurse-submodules \ https://github.com/razorx89/pydicom-seg.git cd pydicom-seg poetry build pip install dist/pydicom_seg--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. ```bash 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 ```python 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 ```python 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](http://qiicr.org/dcmqi/#/seg). ```python 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](./LICENSE). %package -n python3-pydicom-seg Summary: Python package for DICOM-SEG medical segmentation file reading and writing Provides: python-pydicom-seg BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-pydicom-seg # pydicom-seg [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Python versions](https://img.shields.io/pypi/pyversions/pydicom-seg.svg)](https://img.shields.io/pypi/pyversions/pydicom-seg.svg) [![PyPI version](https://badge.fury.io/py/pydicom-seg.svg)](https://badge.fury.io/py/pydicom-seg) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3597420.svg)](https://doi.org/10.5281/zenodo.3597420) Reading and writing of [DICOM-SEG](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.8.20.html) medical image segmentation storage files using [pydicom](https://github.com/pydicom/pydicom) as DICOM serialization/deserialization library. For detailed explanations about supported functionality and usage please have a look at the [documentation](https://razorx89.github.io/pydicom-seg). ## Motivation Converting DICOM-SEG files into ITK compatible data formats, commonly used for research, is made possible by the [dcmqi](https://github.com/QIICR/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 ```bash pip install pydicom-seg ``` ### Install from source This package uses [Poetry](https://python-poetry.org/) (version >= 1.0.5) as build system. ```bash git clone \ --recurse-submodules \ https://github.com/razorx89/pydicom-seg.git cd pydicom-seg poetry build pip install dist/pydicom_seg--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. ```bash 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 ```python 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 ```python 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](http://qiicr.org/dcmqi/#/seg). ```python 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](./LICENSE). %package help Summary: Development documents and examples for pydicom-seg Provides: python3-pydicom-seg-doc %description help # pydicom-seg [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Python versions](https://img.shields.io/pypi/pyversions/pydicom-seg.svg)](https://img.shields.io/pypi/pyversions/pydicom-seg.svg) [![PyPI version](https://badge.fury.io/py/pydicom-seg.svg)](https://badge.fury.io/py/pydicom-seg) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3597420.svg)](https://doi.org/10.5281/zenodo.3597420) Reading and writing of [DICOM-SEG](http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.8.20.html) medical image segmentation storage files using [pydicom](https://github.com/pydicom/pydicom) as DICOM serialization/deserialization library. For detailed explanations about supported functionality and usage please have a look at the [documentation](https://razorx89.github.io/pydicom-seg). ## Motivation Converting DICOM-SEG files into ITK compatible data formats, commonly used for research, is made possible by the [dcmqi](https://github.com/QIICR/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 ```bash pip install pydicom-seg ``` ### Install from source This package uses [Poetry](https://python-poetry.org/) (version >= 1.0.5) as build system. ```bash git clone \ --recurse-submodules \ https://github.com/razorx89/pydicom-seg.git cd pydicom-seg poetry build pip install dist/pydicom_seg--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. ```bash 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 ```python 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 ```python 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](http://qiicr.org/dcmqi/#/seg). ```python 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](./LICENSE). %prep %autosetup -n pydicom-seg-0.4.1 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-pydicom-seg -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Fri Jun 09 2023 Python_Bot - 0.4.1-1 - Package Spec generated