From 027f8c68e46def76e21371d2dfa067f7730e0538 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Tue, 13 Dec 2016 12:31:04 +0000 Subject: [PATCH] Image wrapper indexing tests --- tests/test_imagewrapper.py | 196 +++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) diff --git a/tests/test_imagewrapper.py b/tests/test_imagewrapper.py index 49bdaa274..becd695f0 100644 --- a/tests/test_imagewrapper.py +++ b/tests/test_imagewrapper.py @@ -1034,3 +1034,199 @@ def test_collapseExpansions(niters): for exp, col in zip(expected, collapsed): assert expEq(exp, col) + + +def test_3D_indexing(shape=None, img=None): + + # Test that a 3D image looks like a 3D image + + if shape is None: shape = (21, 22, 23) + elif len(shape) == 2: shape = tuple(list(shape) + [1]) + + if img is None: + data = np.random.random(shape) + nibImg = nib.Nifti1Image(data, np.eye(4)) + img = imagewrap.ImageWrapper(nibImg, loadData=True) + + assert tuple(img[:] .shape) == tuple(shape) + assert tuple(img[:, :] .shape) == tuple(shape) + assert tuple(img[:, :, :].shape) == tuple(shape) + assert tuple(img[:, 0, 0].shape) == (shape[0], ) + assert tuple(img[0, :, 0].shape) == (shape[1], ) + assert tuple(img[0, 0, :].shape) == (shape[2], ) + assert tuple(img[0, :, :].shape) == (shape[1], shape[2]) + assert tuple(img[:, 0, :].shape) == (shape[0], shape[2]) + assert tuple(img[:, :, 0].shape) == (shape[0], shape[1]) + + assert type(img[0, 0, 0]) == np.float64 + + mask1 = np.zeros(shape, dtype=np.bool) + + mask1[0, 0, 0] = True + mask1[1, 0, 0] = True + + assert tuple(img[mask1].shape) == (2, ) + + img[0, 0, 0] = 999 + img[:, 0, 0] = [999] * shape[0] + img[0, :, 0] = [999] * shape[1] + img[0, 0, :] = [999] * shape[2] + img[:, 0, 0] = np.array([999] * shape[0]) + img[0, :, 0] = np.array([999] * shape[1]) + img[0, 0, :] = np.array([999] * shape[2]) + + img[0, :, :] = np.ones((shape[1], shape[2])) + img[:, 0, :] = np.ones((shape[0], shape[2])) + img[:, :, 0] = np.ones((shape[0], shape[1])) + + img[0, :, :] = [[999] * shape[1]] * shape[2] + img[:, 0, :] = [[999] * shape[0]] * shape[2] + img[:, :, 0] = [[999] * shape[0]] * shape[1] + +def test_3D_4D_indexing(): + + + # Testing ImageWrapper for an image with a + # trailing fourth dimension of length 1 - + # it should look like a 3D image, but + # should still accept (valid) 4D slicing. + + # __getitem__ and __setitem__ on + # - 3D index + # - 4D index + # - 3D boolean array + # - 4D boolean array + # + padShape = (21, 22, 23, 1) + shape = padShape[:3] + + data = np.random.random(shape) + nibImg = nib.Nifti1Image(data, np.eye(4)) + img = imagewrap.ImageWrapper(nibImg, loadData=True) + + test_3D_indexing(shape, img) + + assert tuple(img[:, :, :, :].shape) == tuple(shape) + + assert tuple(img[:, 0, 0, 0].shape) == (shape[0], ) + assert tuple(img[:, 0, 0, :].shape) == (shape[0], ) + + assert tuple(img[:, :, 0, 0].shape) == (shape[0], shape[1]) + assert tuple(img[:, :, 0, :].shape) == (shape[0], shape[1]) + + assert type(img[0, 0, 0, 0]) == np.float64 + assert type(img[0, 0, 0, :]) == np.float64 + + mask = np.zeros(padShape, dtype=np.bool) + mask[0, 0, 0, 0] = True + + assert type(img[mask]) == np.ndarray + assert img[mask].shape == (1, ) + + +def test_3D_len_one_indexing(shape=None, img=None): + + # Testing ImageWrapper for a 3D image with + # a third dimension of length 1 - it should + # look like a 3D image, but should still + # accept (valid) 2D slicing. + + if shape is None: shape = (20, 20, 1) + elif len(shape) < 3: shape = tuple(list(shape) + [1]) + + if img is None: + data = np.random.random(shape) + nibImg = nib.Nifti1Image(data, np.eye(4)) + img = imagewrap.ImageWrapper(nibImg, loadData=True) + + test_3D_indexing(shape, img) + + assert type(img[0, 0, :]) == np.ndarray + assert type(img[0, 0]) == np.ndarray + assert type(img[0, 0, 0]) == np.float64 + + mask = np.zeros(shape[:2], dtype=np.bool) + mask[0, 0] = True + + assert type(img[mask]) == np.ndarray + assert img[mask].shape == (1, ) + + mask = np.zeros(shape, dtype=np.bool) + mask[0, 0, 0] = True + + assert type(img[mask]) == np.ndarray + assert img[mask].shape == (1, ) + + +def test_2D_indexing(): + + # Testing ImageWrapper for a 2D image - + # it should look just like a 3D image + # (the same as is tested above). + + shape = (20, 20) + data = np.random.random(shape[:2]) + nibImg = nib.Nifti1Image(data, np.eye(4)) + img = imagewrap.ImageWrapper(nibImg, loadData=True) + + test_3D_len_one_indexing(shape, img) + + +def test_4D_indexing(shape=None, img=None): + + if shape is None: + shape = (20, 21, 22, 23) + + if img is None: + + data = np.random.random(shape) + nibImg = nib.Nifti1Image(data, affine=np.eye(4)) + img = imagewrap.ImageWrapper(nibImg, loadData=True) + + assert tuple(img[:] .shape) == tuple(shape) + assert tuple(img[:, :] .shape) == tuple(shape) + assert tuple(img[:, :, :] .shape) == tuple(shape) + assert tuple(img[:, :, :, :].shape) == tuple(shape) + + assert tuple(img[:, 0, 0, 0].shape) == (shape[0], ) + assert tuple(img[0, :, 0, 0].shape) == (shape[1], ) + assert tuple(img[0, 0, :, 0].shape) == (shape[2], ) + assert tuple(img[0, 0, 0, :].shape) == (shape[3], ) + + + assert tuple(img[0, :, :, :].shape) == (shape[1], shape[2], shape[3]) + assert tuple(img[:, 0, :, :].shape) == (shape[0], shape[2], shape[3]) + assert tuple(img[:, :, 0, :].shape) == (shape[0], shape[1], shape[3]) + assert tuple(img[:, :, :, 0].shape) == (shape[0], shape[1], shape[2]) + + assert type(img[0, 0, 0, 0]) == np.float64 + + mask1 = np.zeros(shape, dtype=np.bool) + + mask1[0, 0, 0, 0] = True + mask1[1, 0, 0, 0] = True + + assert tuple(img[mask1].shape) == (2, ) + + img[0, 0, 0, 0] = 999 + + img[:, 0, 0, 0] = [999] * shape[0] + img[0, :, 0, 0] = [999] * shape[1] + img[0, 0, :, 0] = [999] * shape[2] + img[0, 0, 0, :] = [999] * shape[3] + + img[:, 0, 0, 0] = np.array([999] * shape[0]) + img[0, :, 0, 0] = np.array([999] * shape[1]) + img[0, 0, :, 0] = np.array([999] * shape[2]) + img[0, 0, 0, :] = np.array([999] * shape[3]) + + + img[0, :, :, :] = np.ones((shape[1], shape[2], shape[3])) + img[:, 0, :, :] = np.ones((shape[0], shape[2], shape[3])) + img[:, :, 0, :] = np.ones((shape[0], shape[1], shape[3])) + img[:, :, :, 0] = np.ones((shape[0], shape[1], shape[2])) + + img[0, :, :, :] = [[[999] * shape[1]] * shape[2]] * shape[3] + img[:, 0, :, :] = [[[999] * shape[0]] * shape[2]] * shape[3] + img[:, :, 0, :] = [[[999] * shape[0]] * shape[1]] * shape[3] + img[:, :, :, 0] = [[[999] * shape[0]] * shape[1]] * shape[2] -- GitLab