scikit-image
224 строки · 6.4 Кб
1import numpy as np
2from skimage._shared.testing import assert_array_equal, assert_allclose
3
4from skimage.draw import ellipsoid, ellipsoid_stats, rectangle
5from skimage._shared import testing
6
7
8def test_ellipsoid_sign_parameters1():
9with testing.raises(ValueError):
10ellipsoid(-1, 2, 2)
11
12
13def test_ellipsoid_sign_parameters2():
14with testing.raises(ValueError):
15ellipsoid(0, 2, 2)
16
17
18def test_ellipsoid_sign_parameters3():
19with testing.raises(ValueError):
20ellipsoid(-3, -2, 2)
21
22
23def test_ellipsoid_bool():
24test = ellipsoid(2, 2, 2)[1:-1, 1:-1, 1:-1]
25test_anisotropic = ellipsoid(2, 2, 4, spacing=(1.0, 1.0, 2.0))
26test_anisotropic = test_anisotropic[1:-1, 1:-1, 1:-1]
27
28expected = 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
68assert_array_equal(test, expected.astype(bool))
69assert_array_equal(test_anisotropic, expected.astype(bool))
70
71
72def test_ellipsoid_levelset():
73test = ellipsoid(2, 2, 2, levelset=True)[1:-1, 1:-1, 1:-1]
74test_anisotropic = ellipsoid(2, 2, 4, spacing=(1.0, 1.0, 2.0), levelset=True)
75test_anisotropic = test_anisotropic[1:-1, 1:-1, 1:-1]
76
77expected = 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
117assert_allclose(test, expected)
118assert_allclose(test_anisotropic, expected)
119
120
121def test_ellipsoid_stats():
122# Test comparison values generated by Wolfram Alpha
123vol, surf = ellipsoid_stats(6, 10, 16)
124assert_allclose(1280 * np.pi, vol, atol=1e-6)
125assert_allclose(1383.2828269179892359787, surf, atol=1e-6)
126
127# Test when a <= b <= c does not hold
128vol, surf = ellipsoid_stats(16, 6, 10)
129assert_allclose(1280 * np.pi, vol, atol=1e-6)
130assert_allclose(1383.2828269179892359787, surf, atol=1e-6)
131
132# Larger test to ensure reliability over broad range
133vol, surf = ellipsoid_stats(17, 27, 169)
134assert_allclose(103428 * np.pi, vol, atol=1e-4)
135assert_allclose(37426.253635465972897880, surf, atol=1e-6)
136
137# For equal a, b, c values
138vol, surf = ellipsoid_stats(10, 10, 10)
139assert_allclose(4000 * np.pi / 3, vol, atol=1e-6)
140assert_allclose(400 * np.pi, surf, atol=1e-6)
141
142
143def test_rect_3d_extent():
144expected = 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],
175dtype=np.uint8,
176)
177img = np.zeros((4, 5, 5), dtype=np.uint8)
178start = (0, 0, 2)
179extent = (5, 2, 3)
180pp, rr, cc = rectangle(start, extent=extent, shape=img.shape)
181img[pp, rr, cc] = 1
182assert_array_equal(img, expected)
183
184
185def test_rect_3d_end():
186expected = 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],
217dtype=np.uint8,
218)
219img = np.zeros((4, 5, 5), dtype=np.uint8)
220start = (1, 0, 2)
221end = (3, 2, 3)
222pp, rr, cc = rectangle(start, end=end, shape=img.shape)
223img[pp, rr, cc] = 1
224assert_array_equal(img, expected)
225