File: simpleitk.py

package info (click to toggle)
python-imageio 2.37.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,144 kB
  • sloc: python: 26,306; makefile: 138
file content (156 lines) | stat: -rw-r--r-- 4,106 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# -*- coding: utf-8 -*-
# imageio is distributed under the terms of the (new) BSD License.

"""Read/Write images using SimpleITK.

Backend: `Insight Toolkit <https://itk.org/>`_

.. note::
    To use this plugin you have to install its backend::

        pip install imageio[itk]

The ItkFormat uses the ITK or SimpleITK library to support a range of
ITK-related formats. It also supports a few common formats (e.g. PNG and JPEG).

Parameters
----------
None

"""

from ..core import Format, has_module

_itk = None  # Defer loading to load_lib() function.


def load_lib():
    global _itk, _read_function, _write_function
    try:
        import itk as _itk

        _read_function = _itk.imread
        _write_function = _itk.imwrite
    except ImportError:
        try:
            import SimpleITK as _itk

            _read_function = _itk.ReadImage
            _write_function = _itk.WriteImage
        except ImportError:
            raise ImportError(
                "itk could not be found. "
                "Please try "
                "  python -m pip install itk "
                "or "
                "  python -m pip install simpleitk "
                "or refer to "
                "  https://itkpythonpackage.readthedocs.io/ "
                "for further instructions."
            )
    return _itk


# Split up in real ITK and all supported formats.
ITK_FORMATS = (
    ".gipl",
    ".ipl",
    ".mha",
    ".mhd",
    ".nhdr",
    "nia",
    "hdr",
    ".nrrd",
    ".nii",
    ".nii.gz",
    ".img",
    ".img.gz",
    ".vtk",
    "hdf5",
    "lsm",
    "mnc",
    "mnc2",
    "mgh",
    "mnc",
    "pic",
)
ALL_FORMATS = ITK_FORMATS + (
    ".bmp",
    ".jpeg",
    ".jpg",
    ".png",
    ".tiff",
    ".tif",
    ".dicom",
    ".dcm",
    ".gdcm",
)


class ItkFormat(Format):
    """See :mod:`imageio.plugins.simpleitk`"""

    def _can_read(self, request):
        # If the request is a format that only this plugin can handle,
        # we report that we can do it; a useful error will be raised
        # when simpleitk is not installed. For the more common formats
        # we only report that we can read if the library is installed.
        if request.extension in ITK_FORMATS:
            return True
        if has_module("itk.ImageIOBase") or has_module("SimpleITK"):
            return request.extension in ALL_FORMATS

    def _can_write(self, request):
        if request.extension in ITK_FORMATS:
            return True
        if has_module("itk.ImageIOBase") or has_module("SimpleITK"):
            return request.extension in ALL_FORMATS

    # -- reader

    class Reader(Format.Reader):
        def _open(self, pixel_type=None, fallback_only=None, **kwargs):
            if not _itk:
                load_lib()
            args = ()
            if pixel_type is not None:
                args += (pixel_type,)
                if fallback_only is not None:
                    args += (fallback_only,)
            self._img = _read_function(self.request.get_local_filename(), *args)

        def _get_length(self):
            return 1

        def _close(self):
            pass

        def _get_data(self, index):
            # Get data
            if index != 0:
                error_msg = "Index out of range while reading from itk file"
                raise IndexError(error_msg)

            # Return array and empty meta data
            return _itk.GetArrayFromImage(self._img), {}

        def _get_meta_data(self, index):
            error_msg = "The itk plugin does not support meta data, currently."
            raise RuntimeError(error_msg)

    # -- writer
    class Writer(Format.Writer):
        def _open(self):
            if not _itk:
                load_lib()

        def _close(self):
            pass

        def _append_data(self, im, meta):
            _itk_img = _itk.GetImageFromArray(im)
            _write_function(_itk_img, self.request.get_local_filename())

        def set_meta_data(self, meta):
            error_msg = "The itk plugin does not support meta data, currently."
            raise RuntimeError(error_msg)