From f7d9524614ae0cd011d3d9828b63e75ab8989b17 Mon Sep 17 00:00:00 2001 From: Wenqi Li Date: Tue, 8 Dec 2020 18:10:15 +0000 Subject: [PATCH 1/2] adds test init_reader Signed-off-by: Wenqi Li --- tests/test_init_reader.py | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/test_init_reader.py diff --git a/tests/test_init_reader.py b/tests/test_init_reader.py new file mode 100644 index 0000000000..87777d83a3 --- /dev/null +++ b/tests/test_init_reader.py @@ -0,0 +1,48 @@ +# Copyright 2020 MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from monai.data import ITKReader, NibabelReader, NumpyReader, PILReader +from monai.transforms import LoadImage, LoadImaged + + +class TestInitLoadImage(unittest.TestCase): + def test_load_image(self): + instance1 = LoadImage(image_only=False, dtype=None) + instance2 = LoadImage(image_only=True, dtype=None) + self.assertIsInstance(instance1, LoadImage) + self.assertIsInstance(instance2, LoadImage) + + for r in ["NibabelReader", "PILReader", "ITKReader", "NumpyReader", None]: + inst = LoadImaged("image", reader=r) + self.assertIsInstance(inst, LoadImaged) + + def test_readers(self): + inst = ITKReader() + self.assertIsInstance(inst, ITKReader) + + inst = NibabelReader() + self.assertIsInstance(inst, NibabelReader) + inst = NibabelReader(as_closest_canonical=True) + self.assertIsInstance(inst, NibabelReader) + + inst = NumpyReader() + self.assertIsInstance(inst, NumpyReader) + inst = NumpyReader(npz_keys="test") + self.assertIsInstance(inst, NumpyReader) + + inst = PILReader() + self.assertIsInstance(inst, PILReader) + + +if __name__ == "__main__": + unittest.main() From ea19d5d0ec44c6ea5edf1b4e79d5b40631a6a7da Mon Sep 17 00:00:00 2001 From: Wenqi Li Date: Tue, 8 Dec 2020 18:13:14 +0000 Subject: [PATCH 2/2] fixes loadimage Signed-off-by: Wenqi Li --- monai/data/image_reader.py | 16 +++++++++------- monai/transforms/io/array.py | 11 ++++++----- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index 6c243f2b08..5b0450ab8a 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -28,12 +28,14 @@ from itk import Image # type: ignore from nibabel.nifti1 import Nifti1Image from PIL import Image as PILImage + + has_itk = has_nib = has_pil = True else: - itk, _ = optional_import("itk", allow_namespace_pkg=True) + itk, has_itk = optional_import("itk", allow_namespace_pkg=True) Image, _ = optional_import("itk", allow_namespace_pkg=True, name="Image") - nib, _ = optional_import("nibabel") + nib, has_nib = optional_import("nibabel") Nifti1Image, _ = optional_import("nibabel.nifti1", name="Nifti1Image") - PILImage, _ = optional_import("PIL.Image") + PILImage, has_pil = optional_import("PIL.Image") class ImageReader(ABC): @@ -121,7 +123,7 @@ class ITKReader(ImageReader): def __init__(self, **kwargs): super().__init__() self.kwargs = kwargs - if int(itk.Version.GetITKMajorVersion()) == 5 and int(itk.Version.GetITKMinorVersion()) < 2: + if has_itk and int(itk.Version.GetITKMajorVersion()) == 5 and int(itk.Version.GetITKMinorVersion()) < 2: # warning the ITK LazyLoading mechanism was not threadsafe until version 5.2.0, # requesting access to the itk.imread function triggers the lazy loading of the relevant itk modules # before the parallel use of the function. @@ -136,7 +138,7 @@ def verify_suffix(self, filename: Union[Sequence[str], str]) -> bool: if a list of files, verify all the suffixes. """ - return True + return has_itk def read(self, data: Union[Sequence[str], str], **kwargs): """ @@ -307,7 +309,7 @@ def verify_suffix(self, filename: Union[Sequence[str], str]) -> bool: """ suffixes: Sequence[str] = ["nii", "nii.gz"] - return is_supported_format(filename, suffixes) + return has_nib and is_supported_format(filename, suffixes) def read(self, data: Union[Sequence[str], str], **kwargs): """ @@ -522,7 +524,7 @@ def verify_suffix(self, filename: Union[Sequence[str], str]) -> bool: if a list of files, verify all the suffixes. """ suffixes: Sequence[str] = ["png", "jpg", "bmp"] - return is_supported_format(filename, suffixes) + return has_pil and is_supported_format(filename, suffixes) def read(self, data: Union[Sequence[str], str, np.ndarray], **kwargs): """ diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index 22e2b8e3d6..fd44555fa7 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -70,13 +70,14 @@ def __init__( if reader is not None: if isinstance(reader, str): supported_readers = { - "NibabelReader": NibabelReader, - "PILReader": PILReader, - "ITKReader": ITKReader, - "NumpyReader": NumpyReader, + "nibabelreader": NibabelReader, + "pilreader": PILReader, + "itkreader": ITKReader, + "numpyreader": NumpyReader, } + reader = reader.lower() if reader not in supported_readers: - raise ValueError(f"unsupported reader type: {reader}.") + raise ValueError(f"unsupported reader type: {reader}, available options: {supported_readers}.") self.register(supported_readers[reader](*args, **kwargs)) else: self.register(reader)