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)
|