@@ -85,180 +85,56 @@ def get_values_below_labels_list(im_seg, im_anat, labels_list):
85
85
# ---- Second part ----
86
86
87
87
88
-
89
88
def get_volumes_per_label (im_segm , labels , labels_names , tot_volume_prior = None , verbose = 0 ):
90
89
"""
90
+ Get a separate volume for each label in a data-frame
91
91
:param im_segm:
92
92
:param labels:
93
93
:param labels_names: index of labels in the final dataframes.
94
94
:param tot_volume_prior:
95
95
:param verbose:
96
96
:return:
97
97
"""
98
- num_voxels = get_total_num_nonzero_voxels (im_segm )
99
- vol_mm3 = num_voxels * one_voxel_volume (im_segm )
98
+ num_non_zero_voxels = get_total_num_nonzero_voxels (im_segm )
99
+ vol_non_zero_voxels_mm3 = num_non_zero_voxels * one_voxel_volume (im_segm )
100
100
if tot_volume_prior is None :
101
- tot_volume_prior = 1
102
- if tot_volume_prior == 'tot' :
103
- tot_volume_prior = vol_mm3
104
-
101
+ tot_volume_prior = vol_non_zero_voxels_mm3
105
102
if labels_names == 'tot' :
106
103
107
104
data_frame = pa .DataFrame ({'Labels' : pa .Series (labels , index = [labels_names ]),
108
- 'Num voxels' : pa .Series (num_voxels , index = [labels_names ]),
109
- 'Volume' : pa .Series (vol_mm3 , index = [labels_names ]),
110
- 'Vol over Tot' : pa .Series (vol_mm3 / tot_volume_prior , index = [labels_names ])})
111
-
112
- else :
113
- all_places = np .zeros_like (im_segm .get_data (), dtype = np .bool )
114
- for label_k in labels :
115
- if isinstance (label_k , int ):
116
- all_places += im_segm .get_data () == label_k
117
- else :
118
- for label_k_j in label_k :
119
- all_places += im_segm .get_data () == label_k_j
120
-
121
- flat_volume_voxel = np .nan_to_num ( (all_places .astype (np .float64 )).flatten () )
122
-
123
- non_zero_voxels = np .count_nonzero (flat_volume_voxel )
124
- volumes = non_zero_voxels * one_voxel_volume (im_segm )
125
- if tot_volume_prior is None :
126
- num_voxels = get_total_num_nonzero_voxels (im_segm )
127
- tot_volume_prior = num_voxels * one_voxel_volume (im_segm )
128
-
129
- vol_over_tot = volumes / float (tot_volume_prior )
130
-
131
- data_frame = pa .DataFrame ({'Labels' : pa .Series (labels , index = labels_names ),
132
- 'Num voxels' : pa .Series (non_zero_voxels , index = labels_names ),
133
- 'Volume' : pa .Series (volumes , index = labels_names ),
134
- 'Vol over Tot' : pa .Series (vol_over_tot , index = labels_names )})
135
- if verbose > 0 :
136
- print (data_frame )
137
-
138
- return data_frame
105
+ 'Num voxels' : pa .Series (num_non_zero_voxels , index = [labels_names ]),
106
+ 'Volume' : pa .Series (vol_non_zero_voxels_mm3 , index = [labels_names ]),
107
+ 'Vol over Tot' : pa .Series (vol_non_zero_voxels_mm3 / tot_volume_prior , index = [labels_names ])})
139
108
140
-
141
- # ---- DUMP ----
142
- '''
143
-
144
- def se_values_below_labels(im_seg, im_anat, labels_list, labels_names=None):
145
- """
146
-
147
- :param im_seg: image segmentation
148
- :param im_anat: image anatomy
149
- :param labels_list: integer, list of labels [l1, l2, ..., ln], or list of list of labels if labels needs to be
150
- considered together.
151
- e.g. labels_list = [1,2,[3,4]] -> values below label 1, values below label 2, values below label 3 and 4.
152
- :return: list of numpy arrays, each element is the flat array of the values below the labels
153
- """
154
- values = []
155
- for label_k in labels_list:
156
- # TODO: optimise with np.where after testing
157
- if isinstance(label_k, int):
158
- all_places += im_seg.get_data() == label_k
159
- else:
160
- all_places = np.zeros_like(im_seg.get_data(), dtype=np.bool)
161
- for label_k_j in label_k:
162
- all_places += im_seg.get_data() == label_k_j
163
-
164
- masked_scalar_data = np.nan_to_num(
165
- (all_places.astype(np.float64) * im_anat.get_data().astype(np.float64)).flatten())
166
- # remove zero elements from the array:
167
- non_zero_masked_scalar_data = masked_scalar_data[np.where(masked_scalar_data > 1e-6)] # 1e-6
168
-
169
- if non_zero_masked_scalar_data.size == 0: # if not non_zero_masked_scalar_data is an empty array.
170
- non_zero_masked_scalar_data = 0.
171
-
172
- values.append(non_zero_masked_scalar_data)
173
- if labels_names is None:
174
- return values
175
109
else :
176
- return pa.Series(values, index=labels_names)
177
-
178
-
179
- def from_values_below_labels_to_mu_std(values_below_labels, labels, labels_names, verbose=0):
180
- """
110
+ non_zero_voxels_list = []
111
+ volumes_list = []
112
+ vol_over_tot_list = []
181
113
182
- :param values_below_labels: output of values_below_labels
183
- :param labels:
184
- :param labels_names:
185
- :param verbose:
186
- :return:
187
- """
188
- data_frame = pa.DataFrame({'Labels' : pa.Series(labels, index=labels_names),
189
- 'Average below label' : pa.Series([np.mean(v) for v in values_below_labels], index=labels_names),
190
- 'Std below label' : pa.Series([np.std(v) for v in values_below_labels], index=labels_names)})
191
-
192
- if verbose > 0:
193
- print(data_frame)
194
-
195
- return data_frame
196
-
197
-
198
- def get_volumes_per_label(im_segm, labels, labels_names, tot_volume_prior=None, verbose=0):
199
- """
200
- :param im_segm:
201
- :param labels:
202
- :param labels_names: index of labels in the final dataframes.
203
- :param tot_volume_prior:
204
- :param verbose:
205
- :return:
206
- """
207
- num_voxels, vol_mm3 = get_total_volume(im_segm)
208
- if tot_volume_prior is None:
209
- tot_volume_prior = 1
210
- if tot_volume_prior == 'tot':
211
- tot_volume_prior = vol_mm3
212
-
213
- if labels_names == 'tot':
214
-
215
- data_frame = pa.DataFrame({'Labels': pa.Series(labels, index=[labels_names]),
216
- 'Num voxels': pa.Series(num_voxels, index=[labels_names]),
217
- 'Volume': pa.Series(vol_mm3, index=[labels_names]),
218
- 'Vol over Tot': pa.Series(vol_mm3 / tot_volume_prior, index=[labels_names])})
219
-
220
- else:
221
- all_places = np.zeros_like(im_segm.get_data(), dtype=np.bool)
222
114
for label_k in labels :
115
+ all_places = np .zeros_like (im_segm .get_data (), dtype = np .bool )
223
116
if isinstance (label_k , int ):
224
117
all_places += im_segm .get_data () == label_k
225
118
else :
226
119
for label_k_j in label_k :
227
120
all_places += im_segm .get_data () == label_k_j
228
121
229
- flat_volume_voxel = np.nan_to_num( (all_places.astype(np.float64)).flatten() )
122
+ flat_volume_voxel = np .nan_to_num ((all_places .astype (np .float64 )).flatten () )
230
123
231
- non_zero_voxels = np.count_nonzero(flat_volume_voxel)
232
- volumes = non_zero_voxels * one_voxel_volume(im_segm)
233
- if tot_volume_prior is None:
234
- tot_volume_prior = get_total_volume(im_segm, labels_to_exclude=[0])[1]
124
+ non_zero_voxels = np .count_nonzero (flat_volume_voxel )
125
+ volumes = non_zero_voxels * one_voxel_volume (im_segm )
235
126
236
- vol_over_tot = volumes / float(tot_volume_prior)
127
+ vol_over_tot = volumes / float (tot_volume_prior )
128
+
129
+ non_zero_voxels_list .append (non_zero_voxels )
130
+ volumes_list .append (volumes )
131
+ vol_over_tot_list .append (vol_over_tot )
237
132
238
133
data_frame = pa .DataFrame ({'Labels' : pa .Series (labels , index = labels_names ),
239
- 'Num voxels': pa.Series(non_zero_voxels , index=labels_names),
240
- 'Volume': pa.Series(volumes , index=labels_names),
241
- 'Vol over Tot': pa.Series(vol_over_tot , index=labels_names)})
134
+ 'Num voxels' : pa .Series (non_zero_voxels_list , index = labels_names ),
135
+ 'Volume' : pa .Series (volumes_list , index = labels_names ),
136
+ 'Vol over Tot' : pa .Series (vol_over_tot_list , index = labels_names )})
242
137
if verbose > 0 :
243
138
print (data_frame )
244
139
245
140
return data_frame
246
-
247
-
248
- def get_mu_std_below_labels(im_segm, im_anatomical, labels, labels_names, verbose=0):
249
- """
250
-
251
- :param im_anatomical:
252
- :param im_segm:
253
- :param labels: can be an integer, or a list.
254
- If it is a list, it can contain sublists.
255
- If labels are in the sublist, volumes will be computed for all the labels in the list.
256
- e.g. [1,2,[3,4]] -> volume of label 1, volume of label 2, volume of label 3 and 4.
257
- :param labels_names:
258
- :param verbose:
259
- :return:
260
- """
261
- values_below_labels = get_values_below_labels(im_segm, im_anatomical, labels)
262
- df = from_values_below_labels_to_mu_std(values_below_labels, labels, labels_names, verbose=verbose)
263
- return df
264
- '''
0 commit comments