def test_reorder_img_mirror(): affine = np.array([[-1.1, -0., 0., 0.], [-0., -1.2, 0., 0.], [-0., -0., 1.3, 0.], [0., 0., 0., 1.]]) img = Nifti1Image(np.zeros((4, 6, 8)), affine=affine) reordered = reorder_img(img) np.testing.assert_allclose( get_bounds(reordered.shape, reordered.affine), get_bounds(img.shape, img.affine), )
def test_reorder_img_mirror(): affine = np.array([ [-1.1, -0., 0., 0.], [-0., -1.2, 0., 0.], [-0., -0., 1.3, 0.], [0., 0., 0., 1.] ]) img = Nifti1Image(np.zeros((4, 6, 8)), affine=affine) reordered = reorder_img(img) np.testing.assert_allclose( get_bounds(reordered.shape, reordered.affine), get_bounds(img.shape, img.affine), )
def test_reorder_img(): # We need to test on a square array, as rotation does not change # shape, whereas reordering does. shape = (5, 5, 5, 2, 2) rng = np.random.RandomState(42) data = rng.rand(*shape) affine = np.eye(4) affine[:3, -1] = 0.5 * np.array(shape[:3]) ref_img = Nifti1Image(data, affine) # Test with purely positive matrices and compare to a rotation for theta, phi in np.random.randint(4, size=(5, 2)): rot = rotation(theta * np.pi / 2, phi * np.pi / 2) rot[np.abs(rot) < 0.001] = 0 rot[rot > 0.9] = 1 rot[rot < -0.9] = 1 b = 0.5 * np.array(shape[:3]) new_affine = from_matrix_vector(rot, b) rot_img = resample_img(ref_img, target_affine=new_affine) np.testing.assert_array_equal(rot_img.get_affine(), new_affine) np.testing.assert_array_equal(rot_img.get_data().shape, shape) reordered_img = reorder_img(rot_img) np.testing.assert_array_equal(reordered_img.get_affine()[:3, :3], np.eye(3)) np.testing.assert_almost_equal(reordered_img.get_data(), data) # Create a non-diagonal affine, and check that we raise a sensible # exception affine[1, 0] = 0.1 ref_img = Nifti1Image(data, affine) testing.assert_raises_regex(ValueError, 'Cannot reorder the axes', reorder_img, ref_img) # Test that no exception is raised when resample='continuous' reorder_img(ref_img, resample='continuous') # Test that resample args gets passed to resample_img interpolation = 'nearest' reordered_img = reorder_img(ref_img, resample=interpolation) resampled_img = resample_img(ref_img, target_affine=reordered_img.get_affine(), interpolation=interpolation) np.testing.assert_array_equal(reordered_img.get_data(), resampled_img.get_data()) # Make sure invalid resample argument is included in the error message interpolation = 'an_invalid_interpolation' pattern = "interpolation must be either.+{0}".format(interpolation) testing.assert_raises_regex(ValueError, pattern, reorder_img, ref_img, resample=interpolation) # Test flipping an axis data = rng.rand(*shape) for i in (0, 1, 2): # Make a diagonal affine with a negative axis, and check that # can be reordered, also vary the shape shape = (i + 1, i + 2, 3 - i) affine = np.eye(4) affine[i, i] *= -1 img = Nifti1Image(data, affine) orig_img = copy.copy(img) #x, y, z = img.get_world_coords() #sample = img.values_in_world(x, y, z) img2 = reorder_img(img) # Check that img has not been changed np.testing.assert_array_equal(img.get_affine(), orig_img.get_affine()) np.testing.assert_array_equal(img.get_data(), orig_img.get_data()) # Test that the affine is indeed diagonal: np.testing.assert_array_equal(img2.get_affine()[:3, :3], np.diag(np.diag( img2.get_affine()[:3, :3]))) assert_true(np.all(np.diag(img2.get_affine()) >= 0))
def test_reorder_img(): # We need to test on a square array, as rotation does not change # shape, whereas reordering does. shape = (5, 5, 5, 2, 2) rng = np.random.RandomState(42) data = rng.rand(*shape) affine = np.eye(4) affine[:3, -1] = 0.5 * np.array(shape[:3]) ref_img = Nifti1Image(data, affine) # Test with purely positive matrices and compare to a rotation for theta, phi in np.random.randint(4, size=(5, 2)): rot = rotation(theta * np.pi / 2, phi * np.pi / 2) rot[np.abs(rot) < 0.001] = 0 rot[rot > 0.9] = 1 rot[rot < -0.9] = 1 b = 0.5 * np.array(shape[:3]) new_affine = from_matrix_vector(rot, b) rot_img = resample_img(ref_img, target_affine=new_affine) np.testing.assert_array_equal(rot_img.affine, new_affine) np.testing.assert_array_equal(rot_img.get_data().shape, shape) reordered_img = reorder_img(rot_img) np.testing.assert_array_equal(reordered_img.affine[:3, :3], np.eye(3)) np.testing.assert_almost_equal(reordered_img.get_data(), data) # Create a non-diagonal affine, and check that we raise a sensible # exception affine[1, 0] = 0.1 ref_img = Nifti1Image(data, affine) testing.assert_raises_regex(ValueError, 'Cannot reorder the axes', reorder_img, ref_img) # Test that no exception is raised when resample='continuous' reorder_img(ref_img, resample='continuous') # Test that resample args gets passed to resample_img interpolation = 'nearest' reordered_img = reorder_img(ref_img, resample=interpolation) resampled_img = resample_img(ref_img, target_affine=reordered_img.affine, interpolation=interpolation) np.testing.assert_array_equal(reordered_img.get_data(), resampled_img.get_data()) # Make sure invalid resample argument is included in the error message interpolation = 'an_invalid_interpolation' pattern = "interpolation must be either.+{0}".format(interpolation) testing.assert_raises_regex(ValueError, pattern, reorder_img, ref_img, resample=interpolation) # Test flipping an axis data = rng.rand(*shape) for i in (0, 1, 2): # Make a diagonal affine with a negative axis, and check that # can be reordered, also vary the shape shape = (i + 1, i + 2, 3 - i) affine = np.eye(4) affine[i, i] *= -1 img = Nifti1Image(data, affine) orig_img = copy.copy(img) #x, y, z = img.get_world_coords() #sample = img.values_in_world(x, y, z) img2 = reorder_img(img) # Check that img has not been changed np.testing.assert_array_equal(img.affine, orig_img.affine) np.testing.assert_array_equal(img.get_data(), orig_img.get_data()) # Test that the affine is indeed diagonal: np.testing.assert_array_equal(img2.affine[:3, :3], np.diag(np.diag(img2.affine[:3, :3]))) assert_true(np.all(np.diag(img2.affine) >= 0))
def test_mni152template_is_reordered(): """See issue #2550""" reordered_mni = reorder_img(load_mni152_template()) assert np.allclose(get_data(reordered_mni), get_data(MNI152TEMPLATE)) assert np.allclose(reordered_mni.affine, MNI152TEMPLATE.affine) assert np.allclose(reordered_mni.shape, MNI152TEMPLATE.shape)