55import numpy as np
66import scipy .ndimage .filters as fil
77
8- from nilabels .tools . defs import root_dir
8+ from nilabels .defs import root_dir
99from nilabels .tools .detections .get_segmentation import intensity_segmentation
10- from nilabels .tools .phantoms_generator .shapes_for_phantoms import ellipsoid_shape , o_shape , c_shape , \
11- cube_shape
1210
1311
14- def generate_figures (creation_list , segmentation_levels = 7 , sigma_smoothing = 6 , foreground = 10 , noise = 5000 ):
15- print (creation_list )
16- print ('\n .\n .\n \n Generating figures for examples, may take some seconds and approx 150MB for the whole '
17- 'dataset.\n .\n .' )
18- pfo_examples = jph (root_dir , 'data_examples' )
12+ # ---------- Simple shapes generators ---------------
13+
14+
15+ def o_shape (omega = (250 , 250 ), radius = 50 ,
16+ background_intensity = 0 , foreground_intensity = 20 , dtype = np .uint8 ):
17+ m = background_intensity * np .ones (omega , dtype = dtype )
18+
19+ if len (omega ) == 2 :
20+ c = [omega [j ] / 2 for j in range (len (omega ))]
21+ for x in range (omega [0 ]):
22+ for y in range (omega [1 ]):
23+ if (x - c [0 ]) ** 2 + (y - c [1 ]) ** 2 < radius ** 2 :
24+ m [x , y ] = foreground_intensity
25+ elif len (omega ) == 3 :
26+ c = [omega [j ] / 2 for j in range (len (omega ))]
27+ for x in range (omega [0 ]):
28+ for y in range (omega [1 ]):
29+ for z in range (omega [2 ]):
30+ if (x - c [0 ]) ** 2 + (y - c [1 ]) ** 2 + (z - c [2 ]) ** 2 < radius ** 2 :
31+ m [x , y , z ] = foreground_intensity
32+ return m
33+
34+
35+ def c_shape (omega = (250 , 250 ), internal_radius = 40 , external_radius = 60 , opening_height = 50 ,
36+ background_intensity = 0 , foreground_intensity = 20 , dtype = np .uint8 , margin = None ):
37+
38+ def get_a_2d_c (omega2 , internal_radius2d , external_radius2d , opening_height2d , background_intensity2d ,
39+ foreground_intensity2d , dtype2d ):
40+
41+ m = background_intensity2d * np .ones (omega2 [:2 ], dtype = dtype2d )
42+
43+ c = [omega2 [j ] / 2 for j in range (len (omega2 ))]
44+ # create the crown
45+ for x in range (omega2 [0 ]):
46+ for y in range (omega2 [1 ]):
47+ if internal_radius2d ** 2 < (x - c [0 ]) ** 2 + (y - c [1 ]) ** 2 < external_radius2d ** 2 :
48+ m [x , y ] = foreground_intensity2d
49+
50+ # open the c
51+ low_lim = int (omega2 [0 ] / 2 ) - int (opening_height2d / 2 )
52+ high_lim = int (omega2 [0 ] / 2 ) + int (opening_height2d / 2 )
53+
54+ for x in range (omega2 [0 ]):
55+ for y in range (int (omega2 [1 ] / 2 ), omega2 [1 ]):
56+ if low_lim < x < high_lim and m [x , y ] == foreground_intensity2d :
57+ m [x , y ] = background_intensity2d
58+
59+ return m
60+
61+ c_2d = get_a_2d_c (omega2 = omega [:2 ], internal_radius2d = internal_radius , external_radius2d = external_radius ,
62+ opening_height2d = opening_height , background_intensity2d = background_intensity ,
63+ foreground_intensity2d = foreground_intensity , dtype2d = dtype )
64+
65+ if len (omega ) == 2 :
66+ return c_2d
67+
68+ elif len (omega ) == 3 :
69+ if margin is None :
70+ return np .repeat (c_2d , omega [2 ]).reshape (omega )
71+ else :
72+ res = np .zeros (omega , dtype = dtype )
73+ for z in range (margin , omega [2 ] - 2 * margin ):
74+ res [..., z ] = c_2d
75+ return res
76+
77+
78+ def ellipsoid_shape (omega , focus_1 , focus_2 , distance , background_intensity = 0 , foreground_intensity = 100 ,
79+ dtype = np .uint8 ):
80+ sky = background_intensity * np .ones (omega , dtype = dtype )
81+ for xi in range (omega [0 ]):
82+ for yi in range (omega [1 ]):
83+ for zi in range (omega [2 ]):
84+ if np .sqrt ((focus_1 [0 ] - xi ) ** 2 + (focus_1 [1 ] - yi ) ** 2 + (focus_1 [2 ] - zi ) ** 2 ) + \
85+ np .sqrt ((focus_2 [0 ] - xi ) ** 2 + (focus_2 [1 ] - yi ) ** 2 + (focus_2 [2 ] - zi ) ** 2 ) <= distance :
86+ sky [xi , yi , zi ] = foreground_intensity
87+ return sky
1988
20- if creation_list ['Examples folder' ]:
2189
90+ def cube_shape (omega , center , side_length , background_intensity = 0 , foreground_intensity = 100 , dtype = np .uint8 ):
91+ sky = background_intensity * np .ones (omega , dtype = dtype )
92+ half_side_length = int (np .ceil (int (side_length / 2 )))
93+
94+ for lx in range (- half_side_length , half_side_length + 1 ):
95+ for ly in range (- half_side_length , half_side_length + 1 ):
96+ for lz in range (- half_side_length , half_side_length + 1 ):
97+ sky [center [0 ] + lx , center [1 ] + ly , center [2 ] + lz ] = foreground_intensity
98+ return sky
99+
100+
101+ def sphere_shape (omega , centre , radius , foreground_intensity = 100 , dtype = np .uint8 ):
102+ sky = np .zeros (omega , dtype = dtype )
103+ for xi in range (omega [0 ]):
104+ for yi in range (omega [1 ]):
105+ for zi in range (omega [2 ]):
106+ if np .sqrt ((centre [0 ] - xi ) ** 2 + (centre [1 ] - yi ) ** 2 + (centre [2 ] - zi ) ** 2 ) <= radius :
107+ sky [xi , yi , zi ] = foreground_intensity
108+ return sky
109+
110+
111+ def generate_figures (creation_list , pfo_examples , segmentation_levels = 7 , sigma_smoothing = 6 , foreground = 10 ):
112+ print ('\n .\n .\n \n Generate figures for the examples, may take some seconds, and will take approx 150MB.\n .\n .' )
113+
114+ if creation_list ['Examples folder' ]:
22115 os .system ('mkdir -p ' + pfo_examples )
23116
24117 if creation_list ['Punt e mes' ]:
25-
26118 data_o_punt = o_shape (omega = (256 , 256 , 256 ), foreground_intensity = foreground , dtype = np .float64 )
27119 data_o_punt = fil .gaussian_filter (data_o_punt , sigma = sigma_smoothing )
28120
@@ -54,7 +146,6 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
54146 print ('mes generated' )
55147
56148 if creation_list ['C' ]:
57-
58149 data_c_ = c_shape (omega = (256 , 256 , 256 ), foreground_intensity = foreground )
59150 data_c_ = fil .gaussian_filter (data_c_ , sigma_smoothing )
60151
@@ -76,7 +167,7 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
76167 if creation_list ['Planetaruim' ]:
77168
78169 omega = (256 , 256 , 256 )
79- centers = [(32 , 36 , 40 ), (100 , 61 , 94 ), (130 , 140 , 99 ), (220 , 110 , 210 ),
170+ centers = [(32 , 36 , 40 ), (100 , 61 , 94 ), (130 , 140 , 99 ), (220 , 110 , 210 ),
80171 (224 , 220 , 216 ), (156 , 195 , 162 ), (126 , 116 , 157 ), (36 , 146 , 46 )]
81172 radii = [21 , 55 , 34 , 13 , 21 , 55 , 34 , 13 ]
82173 intensities = [100 ] * 8
@@ -90,7 +181,7 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
90181 if (center [0 ] - x ) ** 2 + (center [1 ] - y ) ** 2 + (center [2 ] - z ) ** 2 <= radius ** 2 :
91182 sky [x , y , z ] = intensity
92183
93- planetarium = fil .gaussian_filter (sky , np .min (radii )- np .std (radii ))
184+ planetarium = fil .gaussian_filter (sky , np .min (radii ) - np .std (radii ))
94185
95186 nib_planetarium = nib .Nifti1Image (planetarium , affine = np .eye (4 ))
96187 nib .save (nib_planetarium , filename = jph (pfo_examples , 'planetarium.nii.gz' ))
@@ -103,12 +194,12 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
103194 omega = (120 , 140 , 160 )
104195 epsilon = 5 # perturbation set to 0 to restore the axial symmetry
105196 foci_ellipses_left = [np .array ([35 , 70 , 40 ]), np .array ([50 , 70 , 120 ])]
106- foci_ellipses_right = [np .array ([85 + epsilon , 70 - epsilon , 40 + epsilon ]), np .array ([70 , 70 , 120 ])]
197+ foci_ellipses_right = [np .array ([85 + epsilon , 70 - epsilon , 40 + epsilon ]), np .array ([70 , 70 , 120 ])]
107198 d_left = 95
108199 d_right = 95
109200
110- ellipsoid_left = ellipsoid_shape (omega , foci_ellipses_left [0 ], foci_ellipses_left [1 ], d_left ,
111- foreground_intensity = foreground )
201+ ellipsoid_left = ellipsoid_shape (omega , foci_ellipses_left [0 ], foci_ellipses_left [1 ], d_left ,
202+ foreground_intensity = foreground )
112203 ellipsoid_right = ellipsoid_shape (omega , foci_ellipses_right [0 ], foci_ellipses_right [1 ], d_right ,
113204 foreground_intensity = foreground )
114205
@@ -130,12 +221,6 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
130221 nib_ellipsoids_seg_half = nib .Nifti1Image (two_ellipsoids_half_segmentation , affine = np .eye (4 ))
131222 nib .save (nib_ellipsoids_seg_half , filename = jph (pfo_examples , 'ellipsoids_seg_half.nii.gz' ))
132223
133- salt_and_pepper = np .zeros_like (two_ellipsoids_segmentation )
134- for x , y , z in zip (* [np .random .randint (1 , k , size = noise ) for k in salt_and_pepper .shape ]):
135- salt_and_pepper [x , y , z ] = np .random .uniform (1 , 4 )
136- nib_ellipsoids_seg_salt_and_pepper = nib .Nifti1Image (two_ellipsoids_segmentation + salt_and_pepper , affine = np .eye (4 ))
137- nib .save (nib_ellipsoids_seg_salt_and_pepper , filename = jph (pfo_examples , 'ellipsoids_seg_noisy.nii.gz' ))
138-
139224 print ('Buckle ellipsoids half segmented and whole segmented generated' )
140225
141226 if creation_list ['Ellipsoids family' ]:
@@ -159,7 +244,6 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
159244
160245 # --- Generate random ellipsoids in omega: --
161246 for k in range (1 , num_ellipsoids + 1 ):
162-
163247 mid_point = np .array ([50 , 50 , 50 ])
164248 # Get the first focus in a sphere at (25, 25, 50) with radius 15
165249 center_first_focus = np .array ([25 , 50 , 50 ])
@@ -168,7 +252,7 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
168252 u , v = np .random .uniform (), np .random .uniform ()
169253 # sphere point picking (Wolfram)
170254 theta = 2 * np .pi * u
171- phi = np .arccos (2 * v - 1 )
255+ phi = np .arccos (2 * v - 1 )
172256 first_focus = np .array ([radius_first_focus * np .cos (theta ) * np .sin (phi ) + center_first_focus [0 ],
173257 radius_first_focus * np .sin (theta ) * np .sin (phi ) + center_first_focus [1 ],
174258 radius_first_focus * np .cos (phi ) + center_first_focus [2 ]])
@@ -212,7 +296,6 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
212296 os .system (cmd )
213297
214298 if creation_list ['Cubes in the sky' ]:
215-
216299 omega = [80 , 80 , 80 ]
217300 cube_a = [[10 , 60 , 55 ], 11 , 1 ]
218301 cube_b = [[50 , 55 , 42 ], 17 , 2 ]
@@ -235,13 +318,12 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
235318 nib .save (im2 , filename = jph (pfo_examples , 'cubes_in_space.nii.gz' ))
236319
237320 if creation_list ['Sandwich' ]:
238-
239321 omega = [9 , 9 , 10 ]
240322 sandwich = np .zeros (omega )
241323
242- sandwich [:, :2 , :] = 2 * np .ones ([9 , 2 , 10 ])
324+ sandwich [:, :2 , :] = 2 * np .ones ([9 , 2 , 10 ])
243325 sandwich [:, 2 :5 , :] = 3 * np .ones ([9 , 3 , 10 ])
244- sandwich [:, 5 :, :] = 4 * np .ones ([9 , 4 , 10 ])
326+ sandwich [:, 5 :, :] = 4 * np .ones ([9 , 4 , 10 ])
245327 im_sandwich = nib .Nifti1Image (sandwich , affine = np .diag ([0.1 , 0.2 , 0.3 , 1 ]))
246328
247329 nib .save (im_sandwich , filename = jph (pfo_examples , 'sandwich.nii.gz' ))
@@ -298,7 +380,7 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
298380 # f = 15
299381 # a = np.sqrt( (f ** 2 + np.sqrt(f**4 + 4*r**4)) / 2. )
300382 a = 22
301- f = np .sqrt ((a ** 4 - r ** 4 ) / float (a ** 2 ))
383+ f = np .sqrt ((a ** 4 - r ** 4 ) / float (a ** 2 ))
302384 assert f < a , [f , a ]
303385 first_focus_23 = [75 - f , 25 , 25 ] # ellipsoid
304386 second_focus_23 = [75 + f , 25 , 25 ]
@@ -340,16 +422,16 @@ def generate_figures(creation_list, segmentation_levels=7, sigma_smoothing=6, fo
340422
341423
342424if __name__ == '__main__' :
343-
344- creation_list = {'Examples folder' : True ,
425+ creation_steps = {'Examples folder' : True ,
345426 'Punt e mes' : True ,
346427 'C' : True ,
347428 'Planetaruim' : True ,
348429 'Buckle ellipsoids' : True ,
349430 'Ellipsoids family' : True ,
350431 'Cubes in the sky' : True ,
351432 'Sandwich' : True ,
352- 'Four-folds' : True
353- }
433+ 'Four-folds' : True }
434+
435+ path_folder_examples = jph (root_dir , 'data_examples' )
354436
355- generate_figures (creation_list )
437+ generate_figures (creation_steps , path_folder_examples )
0 commit comments