Beispiel #1
0
    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)))
Beispiel #2
0
    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)
Beispiel #3
0
    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]))
Beispiel #4
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)))
Beispiel #5
0
    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)
Beispiel #6
0
    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)
Beispiel #8
0
 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, :, :])
Beispiel #9
0
    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')
Beispiel #10
0
 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])
Beispiel #11
0
 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, :, :])
Beispiel #12
0
    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)
Beispiel #13
0
    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, ...]
Beispiel #14
0
    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])
Beispiel #15
0
    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])
Beispiel #16
0
    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)
Beispiel #17
0
 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)))