diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-31 04:49:08 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-31 04:49:08 +0000 |
commit | 518676d4cf2a8b81bf01a598bfae3de600c28f83 (patch) | |
tree | 8851a05517f59c452dba34bb09ac7bf7a2b97287 | |
parent | b73b8a143c2a64e0ebd01776271c01b90cb399b1 (diff) |
automatic import of python-pydicom-seg
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-pydicom-seg.spec | 442 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 444 insertions, 0 deletions
@@ -0,0 +1 @@ +/pydicom-seg-0.4.1.tar.gz diff --git a/python-pydicom-seg.spec b/python-pydicom-seg.spec new file mode 100644 index 0000000..c7b61ea --- /dev/null +++ b/python-pydicom-seg.spec @@ -0,0 +1,442 @@ +%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.nju.edu.cn/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 + +[](https://opensource.org/licenses/MIT) +[](https://img.shields.io/pypi/pyversions/pydicom-seg.svg) +[](https://badge.fury.io/py/pydicom-seg) +[](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-<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. + +```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 + +[](https://opensource.org/licenses/MIT) +[](https://img.shields.io/pypi/pyversions/pydicom-seg.svg) +[](https://badge.fury.io/py/pydicom-seg) +[](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-<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. + +```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 + +[](https://opensource.org/licenses/MIT) +[](https://img.shields.io/pypi/pyversions/pydicom-seg.svg) +[](https://badge.fury.io/py/pydicom-seg) +[](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-<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. + +```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 +* Wed May 31 2023 Python_Bot <Python_Bot@openeuler.org> - 0.4.1-1 +- Package Spec generated @@ -0,0 +1 @@ +1d4de05a81e69584cb55f222e34dfc76 pydicom-seg-0.4.1.tar.gz |