scikit-image

Форк
0
/
test_draw3d.py 
224 строки · 6.4 Кб
1
import numpy as np
2
from skimage._shared.testing import assert_array_equal, assert_allclose
3

4
from skimage.draw import ellipsoid, ellipsoid_stats, rectangle
5
from skimage._shared import testing
6

7

8
def test_ellipsoid_sign_parameters1():
9
    with testing.raises(ValueError):
10
        ellipsoid(-1, 2, 2)
11

12

13
def test_ellipsoid_sign_parameters2():
14
    with testing.raises(ValueError):
15
        ellipsoid(0, 2, 2)
16

17

18
def test_ellipsoid_sign_parameters3():
19
    with testing.raises(ValueError):
20
        ellipsoid(-3, -2, 2)
21

22

23
def test_ellipsoid_bool():
24
    test = ellipsoid(2, 2, 2)[1:-1, 1:-1, 1:-1]
25
    test_anisotropic = ellipsoid(2, 2, 4, spacing=(1.0, 1.0, 2.0))
26
    test_anisotropic = test_anisotropic[1:-1, 1:-1, 1:-1]
27

28
    expected = np.array(
29
        [
30
            [
31
                [0, 0, 0, 0, 0],
32
                [0, 0, 0, 0, 0],
33
                [0, 0, 1, 0, 0],
34
                [0, 0, 0, 0, 0],
35
                [0, 0, 0, 0, 0],
36
            ],
37
            [
38
                [0, 0, 0, 0, 0],
39
                [0, 1, 1, 1, 0],
40
                [0, 1, 1, 1, 0],
41
                [0, 1, 1, 1, 0],
42
                [0, 0, 0, 0, 0],
43
            ],
44
            [
45
                [0, 0, 1, 0, 0],
46
                [0, 1, 1, 1, 0],
47
                [1, 1, 1, 1, 1],
48
                [0, 1, 1, 1, 0],
49
                [0, 0, 1, 0, 0],
50
            ],
51
            [
52
                [0, 0, 0, 0, 0],
53
                [0, 1, 1, 1, 0],
54
                [0, 1, 1, 1, 0],
55
                [0, 1, 1, 1, 0],
56
                [0, 0, 0, 0, 0],
57
            ],
58
            [
59
                [0, 0, 0, 0, 0],
60
                [0, 0, 0, 0, 0],
61
                [0, 0, 1, 0, 0],
62
                [0, 0, 0, 0, 0],
63
                [0, 0, 0, 0, 0],
64
            ],
65
        ]
66
    )
67

68
    assert_array_equal(test, expected.astype(bool))
69
    assert_array_equal(test_anisotropic, expected.astype(bool))
70

71

72
def test_ellipsoid_levelset():
73
    test = ellipsoid(2, 2, 2, levelset=True)[1:-1, 1:-1, 1:-1]
74
    test_anisotropic = ellipsoid(2, 2, 4, spacing=(1.0, 1.0, 2.0), levelset=True)
75
    test_anisotropic = test_anisotropic[1:-1, 1:-1, 1:-1]
76

77
    expected = np.array(
78
        [
79
            [
80
                [2.0, 1.25, 1.0, 1.25, 2.0],
81
                [1.25, 0.5, 0.25, 0.5, 1.25],
82
                [1.0, 0.25, 0.0, 0.25, 1.0],
83
                [1.25, 0.5, 0.25, 0.5, 1.25],
84
                [2.0, 1.25, 1.0, 1.25, 2.0],
85
            ],
86
            [
87
                [1.25, 0.5, 0.25, 0.5, 1.25],
88
                [0.5, -0.25, -0.5, -0.25, 0.5],
89
                [0.25, -0.5, -0.75, -0.5, 0.25],
90
                [0.5, -0.25, -0.5, -0.25, 0.5],
91
                [1.25, 0.5, 0.25, 0.5, 1.25],
92
            ],
93
            [
94
                [1.0, 0.25, 0.0, 0.25, 1.0],
95
                [0.25, -0.5, -0.75, -0.5, 0.25],
96
                [0.0, -0.75, -1.0, -0.75, 0.0],
97
                [0.25, -0.5, -0.75, -0.5, 0.25],
98
                [1.0, 0.25, 0.0, 0.25, 1.0],
99
            ],
100
            [
101
                [1.25, 0.5, 0.25, 0.5, 1.25],
102
                [0.5, -0.25, -0.5, -0.25, 0.5],
103
                [0.25, -0.5, -0.75, -0.5, 0.25],
104
                [0.5, -0.25, -0.5, -0.25, 0.5],
105
                [1.25, 0.5, 0.25, 0.5, 1.25],
106
            ],
107
            [
108
                [2.0, 1.25, 1.0, 1.25, 2.0],
109
                [1.25, 0.5, 0.25, 0.5, 1.25],
110
                [1.0, 0.25, 0.0, 0.25, 1.0],
111
                [1.25, 0.5, 0.25, 0.5, 1.25],
112
                [2.0, 1.25, 1.0, 1.25, 2.0],
113
            ],
114
        ]
115
    )
116

117
    assert_allclose(test, expected)
118
    assert_allclose(test_anisotropic, expected)
119

120

121
def test_ellipsoid_stats():
122
    # Test comparison values generated by Wolfram Alpha
123
    vol, surf = ellipsoid_stats(6, 10, 16)
124
    assert_allclose(1280 * np.pi, vol, atol=1e-6)
125
    assert_allclose(1383.2828269179892359787, surf, atol=1e-6)
126

127
    # Test when a <= b <= c does not hold
128
    vol, surf = ellipsoid_stats(16, 6, 10)
129
    assert_allclose(1280 * np.pi, vol, atol=1e-6)
130
    assert_allclose(1383.2828269179892359787, surf, atol=1e-6)
131

132
    # Larger test to ensure reliability over broad range
133
    vol, surf = ellipsoid_stats(17, 27, 169)
134
    assert_allclose(103428 * np.pi, vol, atol=1e-4)
135
    assert_allclose(37426.253635465972897880, surf, atol=1e-6)
136

137
    # For equal a, b, c values
138
    vol, surf = ellipsoid_stats(10, 10, 10)
139
    assert_allclose(4000 * np.pi / 3, vol, atol=1e-6)
140
    assert_allclose(400 * np.pi, surf, atol=1e-6)
141

142

143
def test_rect_3d_extent():
144
    expected = np.array(
145
        [
146
            [
147
                [0, 0, 1, 1, 1],
148
                [0, 0, 1, 1, 1],
149
                [0, 0, 0, 0, 0],
150
                [0, 0, 0, 0, 0],
151
                [0, 0, 0, 0, 0],
152
            ],
153
            [
154
                [0, 0, 1, 1, 1],
155
                [0, 0, 1, 1, 1],
156
                [0, 0, 0, 0, 0],
157
                [0, 0, 0, 0, 0],
158
                [0, 0, 0, 0, 0],
159
            ],
160
            [
161
                [0, 0, 1, 1, 1],
162
                [0, 0, 1, 1, 1],
163
                [0, 0, 0, 0, 0],
164
                [0, 0, 0, 0, 0],
165
                [0, 0, 0, 0, 0],
166
            ],
167
            [
168
                [0, 0, 1, 1, 1],
169
                [0, 0, 1, 1, 1],
170
                [0, 0, 0, 0, 0],
171
                [0, 0, 0, 0, 0],
172
                [0, 0, 0, 0, 0],
173
            ],
174
        ],
175
        dtype=np.uint8,
176
    )
177
    img = np.zeros((4, 5, 5), dtype=np.uint8)
178
    start = (0, 0, 2)
179
    extent = (5, 2, 3)
180
    pp, rr, cc = rectangle(start, extent=extent, shape=img.shape)
181
    img[pp, rr, cc] = 1
182
    assert_array_equal(img, expected)
183

184

185
def test_rect_3d_end():
186
    expected = np.array(
187
        [
188
            [
189
                [0, 0, 0, 0, 0],
190
                [0, 0, 0, 0, 0],
191
                [0, 0, 0, 0, 0],
192
                [0, 0, 0, 0, 0],
193
                [0, 0, 0, 0, 0],
194
            ],
195
            [
196
                [0, 0, 1, 1, 0],
197
                [0, 0, 1, 1, 0],
198
                [0, 0, 1, 1, 0],
199
                [0, 0, 0, 0, 0],
200
                [0, 0, 0, 0, 0],
201
            ],
202
            [
203
                [0, 0, 1, 1, 0],
204
                [0, 0, 1, 1, 0],
205
                [0, 0, 1, 1, 0],
206
                [0, 0, 0, 0, 0],
207
                [0, 0, 0, 0, 0],
208
            ],
209
            [
210
                [0, 0, 1, 1, 0],
211
                [0, 0, 1, 1, 0],
212
                [0, 0, 1, 1, 0],
213
                [0, 0, 0, 0, 0],
214
                [0, 0, 0, 0, 0],
215
            ],
216
        ],
217
        dtype=np.uint8,
218
    )
219
    img = np.zeros((4, 5, 5), dtype=np.uint8)
220
    start = (1, 0, 2)
221
    end = (3, 2, 3)
222
    pp, rr, cc = rectangle(start, end=end, shape=img.shape)
223
    img[pp, rr, cc] = 1
224
    assert_array_equal(img, expected)
225

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.