1515import unittest
1616from pathlib import Path
1717
18- import itk
1918import nibabel as nib
2019import numpy as np
2120import torch
2221from parameterized import parameterized
2322from PIL import Image
2423
25- from monai .data import ITKReader , NibabelReader , PydicomReader
24+ from monai .data import NibabelReader , PydicomReader
2625from monai .data .meta_obj import set_track_meta
2726from monai .data .meta_tensor import MetaTensor
2827from monai .transforms import LoadImage
28+ from monai .utils import optional_import
2929from tests .utils import assert_allclose
3030
31+ itk , has_itk = optional_import ("itk" , allow_namespace_pkg = True )
32+ ITKReader , _ = optional_import ("monai.data" , name = "ITKReader" , as_type = "decorator" )
33+ itk_uc , _ = optional_import ("itk" , name = "UC" , allow_namespace_pkg = True )
34+
3135
3236class _MiniReader :
3337 """a test case customised reader"""
@@ -67,34 +71,39 @@ def get_data(self, _obj):
6771
6872TEST_CASE_5 = [{"reader" : NibabelReader (mmap = False )}, ["test_image.nii.gz" ], (128 , 128 , 128 )]
6973
70- TEST_CASE_6 = [{"reader" : ITKReader ()}, ["test_image.nii.gz" ], (128 , 128 , 128 )]
74+ TEST_CASE_6 = [{"reader" : ITKReader () if has_itk else "itkreader" }, ["test_image.nii.gz" ], (128 , 128 , 128 )]
7175
72- TEST_CASE_7 = [{"reader" : ITKReader ()}, ["test_image.nii.gz" ], (128 , 128 , 128 )]
76+ TEST_CASE_7 = [{"reader" : ITKReader () if has_itk else "itkreader" }, ["test_image.nii.gz" ], (128 , 128 , 128 )]
7377
7478TEST_CASE_8 = [
75- {"reader" : ITKReader ()},
79+ {"reader" : ITKReader () if has_itk else "itkreader" },
7680 ["test_image.nii.gz" , "test_image2.nii.gz" , "test_image3.nii.gz" ],
7781 (3 , 128 , 128 , 128 ),
7882]
7983
8084TEST_CASE_8_1 = [
81- {"reader" : ITKReader (channel_dim = 0 )},
85+ {"reader" : ITKReader (channel_dim = 0 ) if has_itk else "itkreader" },
8286 ["test_image.nii.gz" , "test_image2.nii.gz" , "test_image3.nii.gz" ],
8387 (384 , 128 , 128 ),
8488]
8589
8690TEST_CASE_9 = [
87- {"reader" : ITKReader ()},
91+ {"reader" : ITKReader () if has_itk else "itkreader" },
8892 ["test_image.nii.gz" , "test_image2.nii.gz" , "test_image3.nii.gz" ],
8993 (3 , 128 , 128 , 128 ),
9094]
9195
92- TEST_CASE_10 = [{"reader" : ITKReader (pixel_type = itk .UC )}, "tests/testing_data/CT_DICOM" , (16 , 16 , 4 ), (16 , 16 , 4 )]
96+ TEST_CASE_10 = [
97+ {"reader" : ITKReader (pixel_type = itk_uc ) if has_itk else "itkreader" },
98+ "tests/testing_data/CT_DICOM" ,
99+ (16 , 16 , 4 ),
100+ (16 , 16 , 4 ),
101+ ]
93102
94- TEST_CASE_11 = [{"reader" : "ITKReader" , "pixel_type" : itk . UC }, "tests/testing_data/CT_DICOM" , (16 , 16 , 4 ), (16 , 16 , 4 )]
103+ TEST_CASE_11 = [{"reader" : "ITKReader" , "pixel_type" : itk_uc }, "tests/testing_data/CT_DICOM" , (16 , 16 , 4 ), (16 , 16 , 4 )]
95104
96105TEST_CASE_12 = [
97- {"reader" : "ITKReader" , "pixel_type" : itk . UC , "reverse_indexing" : True },
106+ {"reader" : "ITKReader" , "pixel_type" : itk_uc , "reverse_indexing" : True },
98107 "tests/testing_data/CT_DICOM" ,
99108 (16 , 16 , 4 ),
100109 (4 , 16 , 16 ),
@@ -124,14 +133,14 @@ def get_data(self, _obj):
124133TEST_CASE_19 = [{"reader" : PydicomReader ()}, "tests/testing_data/CT_DICOM" , (16 , 16 , 4 ), (16 , 16 , 4 )]
125134
126135TEST_CASE_20 = [
127- {"reader" : "PydicomReader" , "ensure_channel_first" : True },
136+ {"reader" : "PydicomReader" , "ensure_channel_first" : True , "force" : True },
128137 "tests/testing_data/CT_DICOM" ,
129138 (16 , 16 , 4 ),
130139 (1 , 16 , 16 , 4 ),
131140]
132141
133142TEST_CASE_21 = [
134- {"reader" : "PydicomReader" , "affine_lps_to_ras" : True , "defer_size" : "2 MB" },
143+ {"reader" : "PydicomReader" , "affine_lps_to_ras" : True , "defer_size" : "2 MB" , "force" : True },
135144 "tests/testing_data/CT_DICOM" ,
136145 (16 , 16 , 4 ),
137146 (16 , 16 , 4 ),
@@ -146,6 +155,7 @@ def get_data(self, _obj):
146155 TESTS_META .append ([{"reader" : "ITKReader" , "fallback_only" : False }, (128 , 128 , 128 ), track_meta ])
147156
148157
158+ @unittest .skipUnless (has_itk , "itk not installed" )
149159class TestLoadImage (unittest .TestCase ):
150160 @parameterized .expand (
151161 [TEST_CASE_1 , TEST_CASE_2 , TEST_CASE_3 , TEST_CASE_3_1 , TEST_CASE_4 , TEST_CASE_4_1 , TEST_CASE_5 ]
@@ -290,7 +300,7 @@ def test_my_reader(self):
290300
291301 def test_itk_meta (self ):
292302 """test metadata from a directory"""
293- out = LoadImage (image_only = True , reader = "ITKReader" , pixel_type = itk . UC , series_meta = True )(
303+ out = LoadImage (image_only = True , reader = "ITKReader" , pixel_type = itk_uc , series_meta = True )(
294304 "tests/testing_data/CT_DICOM"
295305 )
296306 idx = "0008|103e"
@@ -313,6 +323,7 @@ def test_channel_dim(self, input_param, filename, expected_shape):
313323 self .assertEqual (result .meta ["original_channel_dim" ], input_param ["channel_dim" ])
314324
315325
326+ @unittest .skipUnless (has_itk , "itk not installed" )
316327class TestLoadImageMeta (unittest .TestCase ):
317328 @classmethod
318329 def setUpClass (cls ):
0 commit comments