Passed
Push — master ( b383b7...b7424a )
by Fernando
01:21
created

TestRandomAffine.test_mean()   A

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 2
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
from torchio.transforms import RandomAffine
2
from ...utils import TorchioTestCase
3
4
5
class TestRandomAffine(TorchioTestCase):
6
    """Tests for `RandomAffine`."""
7
    def setUp(self):
8
        # Set image origin far from center
9
        super().setUp()
10
        affine = self.sample_subject.t1.affine
11
        affine[:3, 3] = 1e5
12
13
    def test_rotation_image(self):
14
        # Rotation around image center
15
        transform = RandomAffine(
16
            degrees=(90, 90),
17
            default_pad_value=0,
18
            center='image',
19
        )
20
        transformed = transform(self.sample_subject)
21
        total = transformed.t1.data.sum()
22
        self.assertNotEqual(total, 0)
23
24
    def test_rotation_origin(self):
25
        # Rotation around far away point, image should be empty
26
        transform = RandomAffine(
27
            degrees=(90, 90),
28
            default_pad_value=0,
29
            center='origin',
30
        )
31
        transformed = transform(self.sample_subject)
32
        total = transformed.t1.data.sum()
33
        self.assertEqual(total, 0)
34
35
    def test_no_rotation(self):
36
        transform = RandomAffine(
37
            scales=(1, 1),
38
            degrees=(0, 0),
39
            default_pad_value=0,
40
            center='image',
41
        )
42
        transformed = transform(self.sample_subject)
43
        self.assertTensorAlmostEqual(
44
            self.sample_subject.t1.data,
45
            transformed.t1.data,
46
        )
47
48
        transform = RandomAffine(
49
            scales=(1, 1),
50
            degrees=(180, 180),
51
            default_pad_value=0,
52
            center='image',
53
        )
54
        transformed = transform(self.sample_subject)
55
        transformed = transform(transformed)
56
        self.assertTensorAlmostEqual(
57
            self.sample_subject.t1.data,
58
            transformed.t1.data,
59
        )
60
61
    def test_isotropic(self):
62
        RandomAffine(isotropic=True)(self.sample_subject)
63
64
    def test_mean(self):
65
        RandomAffine(default_pad_value='mean')(self.sample_subject)
66
67
    def test_otsu(self):
68
        RandomAffine(default_pad_value='otsu')(self.sample_subject)
69
70
    def test_bad_center(self):
71
        with self.assertRaises(ValueError):
72
            RandomAffine(center='bad')
73
74
    def test_translation(self):
75
        transform = RandomAffine(
76
            scales=(1, 1),
77
            degrees=0,
78
            translation=(5, 5)
79
        )
80
        transformed = transform(self.sample_subject)
81
82
        # I think the right test should be the following one:
83
        # self.assertTensorAlmostEqual(
84
        #     self.sample_subject.t1.data[:, :-5, :-5, :-5],
85
        #     transformed.t1.data[:, 5:, 5:, 5:]
86
        # )
87
88
        # However the passing test is this one:
89
        self.assertTensorAlmostEqual(
90
            self.sample_subject.t1.data[:, :-5, :-5, 5:],
91
            transformed.t1.data[:, 5:, 5:, :-5]
92
        )
93
94
    def test_negative_scales(self):
95
        with self.assertRaises(ValueError):
96
            RandomAffine(scales=(-1, 1))
97
98
    def test_scale_too_large(self):
99
        with self.assertRaises(ValueError):
100
            RandomAffine(scales=1.5)
101
102
    def test_scales_range_with_negative_min(self):
103
        with self.assertRaises(ValueError):
104
            RandomAffine(scales=(-1, 4))
105
106
    def test_wrong_scales_type(self):
107
        with self.assertRaises(ValueError):
108
            RandomAffine(scales='wrong')
109
110
    def test_wrong_degrees_type(self):
111
        with self.assertRaises(ValueError):
112
            RandomAffine(degrees='wrong')
113
114
    def test_too_many_translation_values(self):
115
        with self.assertRaises(ValueError):
116
            RandomAffine(translation=(-10, 4, 42))
117
118
    def test_wrong_translation_type(self):
119
        with self.assertRaises(ValueError):
120
            RandomAffine(translation='wrong')
121
122
    def test_wrong_center(self):
123
        with self.assertRaises(ValueError):
124
            RandomAffine(center=0)
125
126
    def test_wrong_default_pad_value(self):
127
        with self.assertRaises(ValueError):
128
            RandomAffine(default_pad_value='wrong')
129
130
    def test_wrong_image_interpolation_type(self):
131
        with self.assertRaises(TypeError):
132
            RandomAffine(image_interpolation=0)
133
134
    def test_wrong_image_interpolation_value(self):
135
        with self.assertRaises(ValueError):
136
            RandomAffine(image_interpolation='wrong')
137
138
    def test_incompatible_args_isotropic(self):
139
        with self.assertRaises(ValueError):
140
            RandomAffine(scales=(0.8, 0.5, 0.1), isotropic=True)
141
142
    def test_parse_scales(self):
143
        def do_assert(transform):
144
            self.assertEqual(transform.scales, 3 * (0.9, 1.1))
145
        do_assert(RandomAffine(scales=0.1))
146
        do_assert(RandomAffine(scales=(0.9, 1.1)))
147
        do_assert(RandomAffine(scales=3 * (0.1,)))
148
        do_assert(RandomAffine(scales=3 * [0.9, 1.1]))
149
150
    def test_parse_degrees(self):
151
        def do_assert(transform):
152
            self.assertEqual(transform.degrees, 3 * (-10, 10))
153
        do_assert(RandomAffine(degrees=10))
154
        do_assert(RandomAffine(degrees=(-10, 10)))
155
        do_assert(RandomAffine(degrees=3 * (10,)))
156
        do_assert(RandomAffine(degrees=3 * [-10, 10]))
157
158
    def test_parse_translation(self):
159
        def do_assert(transform):
160
            self.assertEqual(transform.translation, 3 * (-10, 10))
161
        do_assert(RandomAffine(translation=10))
162
        do_assert(RandomAffine(translation=(-10, 10)))
163
        do_assert(RandomAffine(translation=3 * (10,)))
164
        do_assert(RandomAffine(translation=3 * [-10, 10]))
165