summaryrefslogtreecommitdiff
path: root/python-pydicom-seg.spec
diff options
context:
space:
mode:
Diffstat (limited to 'python-pydicom-seg.spec')
-rw-r--r--python-pydicom-seg.spec442
1 files changed, 442 insertions, 0 deletions
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
+
+[![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-<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
+
+[![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-<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
+
+[![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-<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