def test_subtract_series(self): a = Series(np.eye(128)) b = Series(np.eye(128)) a.spacing = (1, 1, 1) b.spacing = a.spacing si = a - b self.assertEqual(si.slices, 1) np.testing.assert_array_equal(si.spacing, np.array((1, 1, 1)))
def test_assign_slice(self): a = np.array(range(4 * 5 * 6), dtype=np.uint16) a.shape = (4, 5, 6) s = Series(a) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0]) n = np.zeros((2, 2, 2), dtype=np.uint16) p = Series(n) p.spacing = (1, 1, 1) p.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, p.shape[0]) a[1:3, 2:4, 2:4] = n[:] s[1:3, 2:4, 2:4] = p[:] np.testing.assert_array_equal(a, s) self.assertEqual(s.slices, 4)
def test_ellipsis_first(self): a1 = np.eye(128) a1.shape = (1, 128, 128) a2 = np.vstack([a1, a1, a1]) a2.shape = (1, 3, 128, 128) a = np.empty([4, 3, 128, 128]) for i in range(4): a[i] = a2 # a = np.vstack([a2,a2,a2,a2]) s = Series(a, input_order=imagedata.formats.INPUT_ORDER_TIME) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0]) s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1]) tags = {} k = 0 for i in range(s.slices): tags[i] = np.arange(k, k + s.shape[0]) k += s.shape[0] s.tags = tags a_slice = a[..., 3:5] s_slice = s[..., 3:5] np.testing.assert_array_equal(a_slice, s_slice) self.assertEqual(s_slice.slices, s.slices) self.assertEqual(len(s_slice.tags[0]), len(s.tags[0]))
def test_copy_series2(self): a = np.eye(128) si1 = Series(a) si1.spacing = (1, 1, 1) si2 = si1.copy() self.assertEqual(si2.slices, 1) np.testing.assert_array_equal(si2.spacing, np.array((1, 1, 1)))
def test_assign_slice_x(self): a1 = np.eye(128) a1.shape = (1, 128, 128) a = np.vstack([a1, a1, a1]) s = Series(a) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0]) n = np.ones_like(a) * 4 p = Series(n) p.spacing = (1, 1, 1) p.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, p.shape[0]) a[:, 3:5, ...] = n[:, 3:5, ...] s[:, 3:5, ...] = p[:, 3:5, ...] np.testing.assert_array_equal(a, s) np.testing.assert_array_equal(s[:, 3:5, ...], p[:, 3:5, ...]) self.assertEqual(s.slices, 3)
def test_slicing_x(self): a1 = np.eye(128) a1.shape = (1, 128, 128) a = np.vstack([a1, a1, a1]) s = Series(a) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0]) a_slice = a[:, 3:5, ...] s_slice = s[:, 3:5, ...] np.testing.assert_array_equal(a_slice, s_slice) self.assertEqual(s_slice.slices, 3)
def test_read_3d_nifti(self): si1 = Series( os.path.join( 'data', 'nifti', 'time_all', 'time_all_fl3d_dynamic_20190207140517_14.nii.gz'), imagedata.formats.INPUT_ORDER_TIME, self.opts) si1 = si1[0] logging.debug('test_read_3d_nifti: si1 {} {} {} {}'.format(type(si1), si1.dtype, si1.min(), si1.max())) logging.debug('test_read_3d_nifti: si1.slices {}'.format(si1.slices)) si1.spacing = (5, 0.41015625, 0.41015625) for slice in range(si1.shape[0]): si1.imagePositions = { slice: np.array([slice, 1, 0]) } si1.orientation = np.array([1, 0, 0, 0, 1, 0]) logging.debug('test_read_3d_nifti: si1.tags {}'.format(si1.tags)) with tempfile.TemporaryDirectory() as d: si1.write(os.path.join(d, 'nifti?Image_%05d'), formats=['nifti'], opts=self.opts) logging.debug('test_read_3d_nifti: si1 {} {} {}'.format(si1.dtype, si1.min(), si1.max())) si2 = Series( os.path.join(d, 'nifti', 'Image_00000.nii.gz'), 'none', self.opts) # noinspection PyArgumentList logging.debug('test_read_3d_nifti: si2 {} {} {}'.format(si2.dtype, si2.min(), si2.max())) self.assertEqual(si1.shape, si2.shape) np.testing.assert_array_equal(si1, si2) logging.debug('test_read_3d_nifti: Get si1.slices {}'.format(si1.slices)) logging.debug('test_read_3d_nifti: Set s3') s3 = si1.astype(np.float64) logging.debug('test_read_3d_nifti: s3 {} {} {} {}'.format(type(s3), issubclass(type(s3), Series), s3.dtype, s3.shape)) logging.debug('test_read_3d_nifti: s3 {} {} {}'.format(s3.dtype, s3.min(), s3.max())) logging.debug('test_read_3d_nifti: s3.slices {}'.format(s3.slices)) si3 = Series(s3) np.testing.assert_array_almost_equal(si1, si3, decimal=4) logging.debug('test_read_3d_nifti: si3.slices {}'.format(si3.slices)) logging.debug('test_read_3d_nifti: si3 {} {} {}'.format(type(si3), si3.dtype, si3.shape)) with tempfile.TemporaryDirectory() as d: si3.write(os.path.join(d, 'n?Image_%05d'), formats=['nifti'], opts=self.opts) s3 = si1 - si2 with tempfile.TemporaryDirectory() as d: s3.write(os.path.join(d, 'diff?Image_%05d'), formats=['nifti'], opts=self.opts)
def test_slicing_t_neg(self): from numpy.random import default_rng rng = default_rng() s = Series(rng.standard_normal(192).reshape((3, 4, 4, 4))) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0]) s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1]) np.testing.assert_array_equal(s[2], s[-1]) np.testing.assert_array_equal(s[1], s[-2]) np.testing.assert_array_equal(s[0], s[-3]) np.testing.assert_array_equal(s[1:2], s[1:-1]) np.testing.assert_array_equal(s[1:2, :, :], s[1:-1, :, :]) np.testing.assert_array_equal(s[0:1, :, :], s[0:-2, :, :])
def test_slicing_dim(self): a1 = np.eye(128) a1.shape = (1, 128, 128) a = np.vstack([a1, a1, a1, a1, a1]) s = Series(a) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0]) s_slice = s[2] self.assertEqual(s_slice.ndim, 2) self.assertEqual(len(s_slice.axes), 2) self.assertEqual(s_slice.axes[0].name, 'row') self.assertEqual(s_slice.axes[1].name, 'column')
def test_slicing_x_neg(self): from numpy.random import default_rng rng = default_rng() s = Series(rng.standard_normal(64).reshape((4, 4, 4))) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0]) np.testing.assert_array_equal(s[:, :, 3], s[:, :, -1]) np.testing.assert_array_equal(s[:, :, 2], s[:, :, -2]) np.testing.assert_array_equal(s[:, :, 1], s[:, :, -3]) np.testing.assert_array_equal(s[:, :, 0], s[:, :, -4]) np.testing.assert_array_equal(s[:, :, 2:3], s[:, :, 2:-1]) np.testing.assert_array_equal(s[:, :, 1:2], s[:, :, 1:-2]) np.testing.assert_array_equal(s[:, :, 0:2], s[:, :, 0:-2])
def test_slicing_z_neg(self): from numpy.random import default_rng rng = default_rng() s = Series(rng.standard_normal(64).reshape((4, 4, 4))) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0]) np.testing.assert_array_equal(s[3, :, :], s[-1, :, :]) np.testing.assert_array_equal(s[2, :, :], s[-2, :, :]) np.testing.assert_array_equal(s[1, :, :], s[-3, :, :]) np.testing.assert_array_equal(s[0, :, :], s[-4, :, :]) np.testing.assert_array_equal(s[2:3], s[2:-1]) np.testing.assert_array_equal(s[2:3, :, :], s[2:-1, :, :]) np.testing.assert_array_equal(s[1:2, :, :], s[1:-2, :, :]) np.testing.assert_array_equal(s[0:2, :, :], s[0:-2, :, :])
def test_write_3d_itk(self): log = logging.getLogger("TestWritePluginITK.test_write_3d_itk") log.debug("test_write_3d_itk") si = Series( os.path.join('data', 'itk', 'time', 'Image_00000.mha'), 'none', self.opts) self.assertEqual(si.dtype, np.uint16) self.assertEqual(si.shape, (40, 192, 152)) # log.debug("test_write_3d_itk: sliceLocations {}".format( # si.sliceLocations)) log.debug("test_write_3d_itk: tags {}".format(si.tags)) log.debug("test_write_3d_itk: spacing {}".format(si.spacing)) log.debug("test_write_3d_itk: imagePositions {}".format( si.imagePositions)) log.debug("test_write_3d_itk: orientation {}".format(si.orientation)) # Modify header si.sliceLocations = [i for i in range(40)] si.spacing = (3, 2, 1) for slice in range(len(si.sliceLocations)): si.imagePositions = { slice: np.array([slice, 1, 0]) } for slice in range(si.shape[1]): si.imagePositions = { slice: si.getPositionForVoxel(np.array([slice, 0, 0])) } # Store image with modified header with tempfile.TemporaryDirectory() as d: si.write(d, self.opts) # Read back the ITK data and verify that the header was modified si2 = Series( d, 'none', self.opts) self.assertEqual(si.shape, si2.shape) np.testing.assert_array_equal(si, si2) # np.testing.assert_array_equal(hdr.sliceLocations, hdr2.sliceLocations) compare_headers(self, si, si2)
def test_multiple_ellipses(self): a1 = np.eye(128) a1.shape = (1, 128, 128) a2 = np.vstack([a1, a1, a1]) a2.shape = (1, 3, 128, 128) a = np.vstack([a2, a2, a2, a2]) s = Series(a, input_order=imagedata.formats.INPUT_ORDER_TIME) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0]) s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1]) tags = {} k = 0 for i in range(s.slices): tags[i] = np.arange(k, k + s.shape[0]) k += s.shape[0] s.tags = tags with self.assertRaises(IndexError): s_slice = s[..., 1:3, ...]
def test_slicing_z(self): a1 = np.eye(128) a1.shape = (1, 128, 128) a = np.vstack([a1, a1, a1]) s = Series(a) s.spacing = (1, 1, 1) s.sliceLocations = [3, 6, 9] for slice in range(s.slices): s.imagePositions = {slice: np.array([slice, 0, 0])} s.axes[0] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[0]) a_slice = a[0:2, ...] s_slice = s[0:2, ...] np.testing.assert_array_equal(a_slice, s_slice) self.assertEqual(s_slice.slices, 2) np.testing.assert_array_equal(s_slice.sliceLocations, np.array([3, 6])) # Compare imagePositions ipp2 = {} for slice in range(2): ipp2[slice] = np.array([slice, 0, 0]) self.assertEqual(len(s_slice.imagePositions), len(ipp2)) for slice in range(2): np.testing.assert_array_equal(s_slice.imagePositions[slice], ipp2[slice])
def test_slicing_t(self): a1 = np.eye(128) a1.shape = (1, 128, 128) a2 = np.vstack([a1, a1, a1]) a2.shape = (1, 3, 128, 128) a = np.vstack([a2, a2, a2, a2]) s = Series(a, input_order=imagedata.formats.INPUT_ORDER_TIME) s.spacing = (1, 1, 1) s.axes[0] = imagedata.axis.UniformLengthAxis('time', 0, s.shape[0]) s.axes[1] = imagedata.axis.UniformLengthAxis('slice', 0, s.shape[1]) tags = {} k = 0 for i in range(s.slices): tags[i] = np.arange(k, k + s.shape[0]) k += s.shape[0] s.tags = tags a_slice = a[1:3, ...] s_slice = s[1:3, ...] np.testing.assert_array_equal(a_slice, s_slice) self.assertEqual(s_slice.slices, 3) self.assertEqual(len(s_slice.tags[0]), 2) for s in range(s_slice.slices): np.testing.assert_array_equal(s_slice.tags[s], tags[s][1:3])
def test_write_4d_itk(self): log = logging.getLogger("TestWritePlugin.test_write_4d_itk") log.debug("test_write_4d_itk") si = Series( [os.path.join('data', 'itk', 'time', 'Image_00000.mha'), os.path.join('data', 'itk', 'time', 'Image_00001.mha'), os.path.join('data', 'itk', 'time', 'Image_00002.mha')], imagedata.formats.INPUT_ORDER_TIME, self.opts) self.assertEqual(si.dtype, np.uint16) self.assertEqual(si.shape, (3, 3, 192, 152)) # np.testing.assert_array_almost_equal(np.arange(0, 10*2.256, 2.256), hdr.getTimeline(), decimal=2) # log.debug("test_write_4d_itk: sliceLocations", hdr.sliceLocations) # log.debug("test_write_4d_itk: tags {}".format(hdr.tags)) # log.debug("test_write_4d_itk: spacing", hdr.spacing) # log.debug("test_write_4d_itk: imagePositions", hdr.imagePositions) # log.debug("test_write_4d_itk: orientation", hdr.orientation) # Modify header si.sliceLocations = (1, 2, 3) si.spacing = (3, 2, 1) for slice in range(si.shape[1]): si.imagePositions = { slice: np.array([slice, 1, 0]) } si.orientation = np.array([0, 0, 1, 0, 1, 0]) for slice in range(si.shape[1]): si.imagePositions = { slice: si.getPositionForVoxel(np.array([slice, 0, 0])).reshape((3, 1)) } si.sort_on = imagedata.formats.SORT_ON_TAG log.debug("test_write_4d_itk: hdr.sort_on {}".format( imagedata.formats.sort_on_to_str(si.sort_on))) si.output_dir = 'single' with tempfile.TemporaryDirectory() as d: si.write(d, self.opts) # Read back the ITK data and verify that the header was modified si2 = Series( d, imagedata.formats.INPUT_ORDER_TIME, self.opts) self.assertEqual((3, 3, 192, 152), si2.shape) # np.testing.assert_array_equal(si, si2) # np.testing.assert_array_equal(hdr.sliceLocations, hdr2.sliceLocations) # log.debug("hdr2.tags.keys(): {}".format(hdr2.tags.keys())) tags = {} for slice in range(3): tags[slice] = np.arange(3) self.assertEqual(tags.keys(), si2.tags.keys()) for k in si2.tags.keys(): np.testing.assert_array_equal(tags[k], si2.tags[k]) np.testing.assert_array_equal(si.spacing, si2.spacing) image_positions = {} for slice in range(3): image_positions[slice] = np.array([0, 1 + 3 * slice, 0]) self.assertEqual(image_positions.keys(), si2.imagePositions.keys()) np.testing.assert_array_equal(si.orientation, si2.orientation)
def test_print_header(self): a = np.eye(128) si = Series(a) si.spacing = (1, 1, 1) self.assertEqual(si.slices, 1) np.testing.assert_array_equal(si.spacing, np.array((1, 1, 1)))