|
11 | 11 |
|
12 | 12 | from __future__ import annotations |
13 | 13 |
|
| 14 | +import os |
| 15 | +import tempfile |
14 | 16 | import unittest |
15 | 17 |
|
| 18 | +import numpy as np |
| 19 | + |
16 | 20 | from monai.data import ITKReader, NibabelReader, NrrdReader, NumpyReader, PILReader, PydicomReader |
17 | 21 | from monai.transforms import LoadImage, LoadImaged |
18 | 22 | from tests.test_utils import SkipIfNoModule |
@@ -76,6 +80,26 @@ def test_readers_to_gpu(self): |
76 | 80 | inst = NibabelReader(to_gpu=to_gpu) |
77 | 81 | self.assertIsInstance(inst, NibabelReader) |
78 | 82 |
|
| 83 | + @SkipIfNoModule("nibabel") |
| 84 | + def test_nibabel_reader_avoids_eager_c_order_copy(self): |
| 85 | + import nibabel as nib |
| 86 | + |
| 87 | + test_image = np.arange(2 * 3 * 4, dtype=np.int16).reshape(2, 3, 4) |
| 88 | + with tempfile.TemporaryDirectory() as tempdir: |
| 89 | + for suffix in (".nii", ".nii.gz"): |
| 90 | + with self.subTest(suffix=suffix): |
| 91 | + filename = os.path.join(tempdir, f"test_image{suffix}") |
| 92 | + nib.save(nib.Nifti1Image(test_image, np.eye(4)), filename) |
| 93 | + |
| 94 | + reader = NibabelReader(mmap=False) |
| 95 | + img = reader.read(filename) |
| 96 | + data, _ = reader.get_data(img) |
| 97 | + |
| 98 | + np.testing.assert_array_equal(data, test_image) |
| 99 | + # The reader must not force an eager C-order copy; the native |
| 100 | + # (F-order) layout from nibabel should be preserved here. |
| 101 | + self.assertFalse(data.flags.c_contiguous) |
| 102 | + |
79 | 103 |
|
80 | 104 | if __name__ == "__main__": |
81 | 105 | unittest.main() |
0 commit comments