From 48b297233cc0feb05683e1075f16c2b98f9edb97 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauldmccarthy@gmail.com> Date: Tue, 23 Jul 2019 15:08:51 +0100 Subject: [PATCH] TEST: Test roi module --- tests/test_image_roi.py | 96 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 tests/test_image_roi.py diff --git a/tests/test_image_roi.py b/tests/test_image_roi.py new file mode 100644 index 000000000..0917c6e24 --- /dev/null +++ b/tests/test_image_roi.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# +# test_image_roi.py - +# +# Author: Paul McCarthy <pauldmccarthy@gmail.com> +# + +import pytest + +import numpy as np + +import fsl.data.image as fslimage +import fsl.utils.image.roi as roi + + +def test_roi(): + + # inshape, bounds, expected outshape, expected affine offset + tests = [ + # 3D image, 3D roi + ([10, 10, 10], [(0, 10), (0, 10), (0, 10)], [10, 10, 10], [0, 0, 0]), + ([10, 10, 10], [(1, 10), (1, 10), (1, 10)], [ 9, 9, 9], [1, 1, 1]), + ([10, 10, 10], [(1, 9), (1, 9), (1, 9)], [ 8, 8, 8], [1, 1, 1]), + ([10, 10, 10], [(3, 5), (3, 5), (3, 5)], [ 2, 2, 2], [3, 3, 3]), + ([10, 10, 10], [(4, 5), (4, 5), (4, 5)], [ 1, 1, 1], [4, 4, 4]), + + # 4D image, 3D roi + ([10, 10, 10, 10], [(0, 10), (0, 10), (0, 10)], [10, 10, 10, 10], [0, 0, 0]), + ([10, 10, 10, 10], [(1, 10), (1, 10), (1, 10)], [ 9, 9, 9, 10], [1, 1, 1]), + ([10, 10, 10, 10], [(1, 9), (1, 9), (1, 9)], [ 8, 8, 8, 10], [1, 1, 1]), + ([10, 10, 10, 10], [(3, 5), (3, 5), (3, 5)], [ 2, 2, 2, 10], [3, 3, 3]), + ([10, 10, 10, 10], [(4, 5), (4, 5), (4, 5)], [ 1, 1, 1, 10], [4, 4, 4]), + + # 4D image, 4D roi + ([10, 10, 10, 10], [(0, 10), (0, 10), (0, 10), (0, 10)], [10, 10, 10, 10], [0, 0, 0]), + ([10, 10, 10, 10], [(1, 10), (1, 10), (1, 10), (1, 10)], [ 9, 9, 9, 9], [1, 1, 1]), + ([10, 10, 10, 10], [(1, 9), (1, 9), (1, 9), (1, 9)], [ 8, 8, 8, 8], [1, 1, 1]), + ([10, 10, 10, 10], [(3, 5), (3, 5), (3, 5), (3, 5)], [ 2, 2, 2, 2], [3, 3, 3]), + ([10, 10, 10, 10], [(4, 5), (4, 5), (4, 5), (4, 5)], [ 1, 1, 1], [4, 4, 4]), + + # expanding FOV + ([10, 10, 10], [(-5, 15), ( 0, 10), ( 0, 10)], [20, 10, 10], [-5, 0, 0]), + ([10, 10, 10], [(-5, 15), (-5, 15), ( 0, 10)], [20, 20, 10], [-5, -5, 0]), + ([10, 10, 10], [(-5, 15), (-5, 10), (-5, 15)], [20, 15, 20], [-5, -5, -5]), + ([10, 10, 10], [(-5, 15), ( 3, 7), ( 0, 10)], [20, 4, 10], [-5, 3, 0]), + ] + + for inshape, bounds, outshape, offset in tests: + data = np.random.randint(1, 10, inshape) + image = fslimage.Image(data, xform=np.eye(4)) + + result = roi.roi(image, bounds) + + expaff = np.eye(4) + expaff[:3, 3] = offset + + assert np.all(list(result.shape) == list(outshape)) + assert np.all(np.isclose(result.voxToWorldMat, expaff)) + + oldslc = [] + newslc = [] + + for (lo, hi), oldlen in zip(bounds, inshape): + oldslc.append(slice(max(lo, 0), min(hi, oldlen))) + + if len(oldslc) < len(inshape): + for d in inshape[len(oldslc):]: + oldslc.append(slice(0, d)) + + for (lo, hi), slc in zip(bounds, oldslc): + if lo < 0: newlo = -lo + else: newlo = 0 + + oldlen = slc.stop - slc.start + + newslc.append(slice(newlo, newlo + oldlen)) + + if len(newslc) > len(outshape): + newslc = newslc[:len(outshape)] + + assert np.all(data[tuple(oldslc)] == result.data[tuple(newslc)]) + + # Error on: + # - not enough bounds + # - too many bounds + # - hi >= lo + data = np.random.randint(1, 10, (10, 10, 10)) + image = fslimage.Image(data, xform=np.eye(4)) + with pytest.raises(ValueError): roi.roi(image, [(0, 10), (0, 10)]) + with pytest.raises(ValueError): roi.roi(image, [(0, 10), (0, 10), (0, 10), (0, 10)]) + with pytest.raises(ValueError): roi.roi(image, [(5, 5), (0, 10), (0, 10)]) + with pytest.raises(ValueError): roi.roi(image, [(6, 5), (0, 10), (0, 10)]) + with pytest.raises(ValueError): roi.roi(image, [(0, 10), (5, 5), (0, 10)]) + with pytest.raises(ValueError): roi.roi(image, [(0, 10), (6, 5), (0, 10)]) + with pytest.raises(ValueError): roi.roi(image, [(0, 10), (0, 10), (5, 5)]) + with pytest.raises(ValueError): roi.roi(image, [(0, 10), (0, 10), (6, 5)]) -- GitLab