Commit 0759123d5d69d55174d6a970b55c49c15dc0a949
1 parent
4838dfee
Exists in
master
and in
5 other branches
ENH: Improvements in mask threshold, like use of buffers, better use of numpy.arrays and some fixes.
Showing
1 changed file
with
61 additions
and
56 deletions
Show diff stats
invesalius/data/slice_.py
... | ... | @@ -184,6 +184,7 @@ class Slice(object): |
184 | 184 | self.CreateMask(name=mask_name, threshold_range=thresh, colour =colour) |
185 | 185 | self.SetMaskColour(self.current_mask.index, self.current_mask.colour) |
186 | 186 | self.SelectCurrentMask(self.current_mask.index) |
187 | + ps.Publisher().sendMessage('Reload actual slice') | |
187 | 188 | |
188 | 189 | def __select_current_mask(self, pubsub_evt): |
189 | 190 | mask_index = pubsub_evt.data |
... | ... | @@ -259,12 +260,15 @@ class Slice(object): |
259 | 260 | #--------------------------------------------------------------------------- |
260 | 261 | |
261 | 262 | def GetSlices(self, orientation, slice_number): |
263 | + print "Getting slice", self.buffer_slices[orientation][0], slice_number | |
262 | 264 | if self.buffer_slices[orientation][0] == slice_number: |
263 | - print "From buffer" | |
264 | 265 | image = self.buffer_slices[orientation][1] |
265 | - n_mask = self.buffer_slices[orientation][2] | |
266 | - mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation) | |
267 | - final_image = self.do_blend(image, self.do_colour_mask(mask)) | |
266 | + if self.current_mask and self.current_mask.is_shown: | |
267 | + n_mask = self.buffer_slices[orientation][2] | |
268 | + mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation) | |
269 | + final_image = self.do_blend(image, self.do_colour_mask(mask)) | |
270 | + else: | |
271 | + final_image = image | |
268 | 272 | else: |
269 | 273 | n_image = self.GetImageSlice(orientation, slice_number) |
270 | 274 | image = iu.to_vtk(n_image, self.spacing, slice_number, orientation) |
... | ... | @@ -285,39 +289,49 @@ class Slice(object): |
285 | 289 | return final_image |
286 | 290 | |
287 | 291 | def GetImageSlice(self, orientation, slice_number): |
288 | - if orientation == 'AXIAL': | |
289 | - n_image = numpy.array(self.matrix[slice_number]) | |
290 | - elif orientation == 'CORONAL': | |
291 | - n_image = numpy.array(self.matrix[..., slice_number, ...]) | |
292 | - elif orientation == 'SAGITAL': | |
293 | - n_image = numpy.array(self.matrix[..., ..., slice_number]) | |
292 | + if self.buffer_slices[orientation] == slice_number: | |
293 | + n_image = self.buffer_slices[orientation][3] | |
294 | + else: | |
295 | + if orientation == 'AXIAL': | |
296 | + n_image = numpy.array(self.matrix[slice_number]) | |
297 | + elif orientation == 'CORONAL': | |
298 | + n_image = numpy.array(self.matrix[..., slice_number, ...]) | |
299 | + elif orientation == 'SAGITAL': | |
300 | + n_image = numpy.array(self.matrix[..., ..., slice_number]) | |
294 | 301 | return n_image |
295 | 302 | |
296 | 303 | def GetMaskSlice(self, orientation, slice_number): |
297 | - slice_number += 1 | |
304 | + """ | |
305 | + It gets the from actual mask the given slice from given orientation | |
306 | + """ | |
307 | + | |
308 | + # It's necessary because the first position for each dimension from | |
309 | + # mask matrix is used as flags to control if the mask in the | |
310 | + # slice_number position has been generated. | |
311 | + n = slice_number + 1 | |
298 | 312 | if orientation == 'AXIAL': |
299 | - if self.current_mask.matrix[slice_number, 0, 0] == 0: | |
300 | - self.current_mask.matrix[slice_number, 1:, 1:] = \ | |
313 | + if self.current_mask.matrix[n, 0, 0] == 0: | |
314 | + self.current_mask.matrix[n, 1:, 1:] = \ | |
301 | 315 | self.do_threshold_to_a_slice(self.GetImageSlice(orientation, |
302 | 316 | slice_number)) |
303 | - self.current_mask.matrix[slice_number, 0, 0] = 1 | |
304 | - n_mask = numpy.array(self.current_mask.matrix[slice_number]) | |
317 | + self.current_mask.matrix[n, 0, 0] = 1 | |
318 | + n_mask = numpy.array(self.current_mask.matrix[n, 1:, 1:]) | |
305 | 319 | |
306 | 320 | elif orientation == 'CORONAL': |
307 | - if self.current_mask.matrix[0, slice_number, 0] == 0: | |
308 | - self.current_mask.matrix[1:, slice_number, 1:] = \ | |
321 | + if self.current_mask.matrix[0, n, 0] == 0: | |
322 | + self.current_mask.matrix[1:, n, 1:] = \ | |
309 | 323 | self.do_threshold_to_a_slice(self.GetImageSlice(orientation, |
310 | 324 | slice_number)) |
311 | - self.current_mask.matrix[0, slice_number, 0] = 1 | |
312 | - n_mask = numpy.array(self.current_mask.matrix[..., slice_number, ...]) | |
325 | + self.current_mask.matrix[0, n, 0] = 1 | |
326 | + n_mask = numpy.array(self.current_mask.matrix[1:, n, 1:]) | |
313 | 327 | |
314 | 328 | elif orientation == 'SAGITAL': |
315 | - if self.current_mask.matrix[0, 0, slice_number] == 0: | |
316 | - self.current_mask.matrix[1:, 1:, slice_number] = \ | |
329 | + if self.current_mask.matrix[0, 0, n] == 0: | |
330 | + self.current_mask.matrix[1:, 1:, n] = \ | |
317 | 331 | self.do_threshold_to_a_slice(self.GetImageSlice(orientation, |
318 | 332 | slice_number)) |
319 | - self.current_mask.matrix[0, 0, slice_number] = 1 | |
320 | - n_mask = numpy.array(self.current_mask.matrix[..., ..., slice_number]) | |
333 | + self.current_mask.matrix[0, 0, n] = 1 | |
334 | + n_mask = numpy.array(self.current_mask.matrix[1:, 1:, n]) | |
321 | 335 | return n_mask |
322 | 336 | |
323 | 337 | def GetNumberOfSlices(self, orientation): |
... | ... | @@ -401,9 +415,8 @@ class Slice(object): |
401 | 415 | else: |
402 | 416 | print "Only one slice" |
403 | 417 | slice_ = self.buffer_slices[orientation][3] |
404 | - m = numpy.zeros(slice_.shape, self.current_mask.matrix.dtype) | |
405 | - m[numpy.logical_and(slice_ >= thresh_min,slice_ <= thresh_max)] = 255 | |
406 | - self.buffer_slices[orientation][2] = m | |
418 | + self.buffer_slices[orientation][2][:] = 0 | |
419 | + self.buffer_slices[orientation][2][numpy.logical_and(slice_ >= thresh_min,slice_ <= thresh_max)] = 255 | |
407 | 420 | |
408 | 421 | # Update viewer |
409 | 422 | #ps.Publisher().sendMessage('Update slice viewer') |
... | ... | @@ -425,12 +438,10 @@ class Slice(object): |
425 | 438 | proj = Project() |
426 | 439 | proj.mask_dict[index].is_shown = value |
427 | 440 | if (index == self.current_mask.index): |
428 | - if value: | |
429 | - self.blend_filter.SetOpacity(1, self.current_mask.opacity) | |
430 | - else: | |
431 | - self.blend_filter.SetOpacity(1, 0) | |
432 | - self.blend_filter.Update() | |
433 | - ps.Publisher().sendMessage('Update slice viewer') | |
441 | + self.buffer_slices = {"AXIAL": [-1, None, None], | |
442 | + "CORONAL": [-1,None, None], | |
443 | + "SAGITAL": [-1, None, None]} | |
444 | + ps.Publisher().sendMessage('Reload actual slice') | |
434 | 445 | #--------------------------------------------------------------------------- |
435 | 446 | def ErasePixel(self, position): |
436 | 447 | "Delete pixel, based on x, y and z position coordinates." |
... | ... | @@ -478,33 +489,27 @@ class Slice(object): |
478 | 489 | #if index != self.current_mask.index: |
479 | 490 | print "SelectCurrentMask" |
480 | 491 | print "index:", index |
481 | - if self.current_mask and self.blend_filter and index > -1: | |
482 | - proj = Project() | |
483 | - future_mask = proj.GetMask(index) | |
484 | - future_mask.is_shown = True | |
485 | - self.current_mask = future_mask | |
486 | - | |
487 | - colour = future_mask.colour | |
488 | - #index = future_mask.index | |
489 | - print index | |
490 | - self.SetMaskColour(index, colour, update=False) | |
492 | + proj = Project() | |
493 | + future_mask = proj.GetMask(index) | |
494 | + future_mask.is_shown = True | |
495 | + self.current_mask = future_mask | |
491 | 496 | |
492 | - imagedata = future_mask.imagedata | |
493 | - self.img_colours_mask.SetInput(imagedata) | |
497 | + colour = future_mask.colour | |
498 | + #index = future_mask.index | |
499 | + print index | |
500 | + self.SetMaskColour(index, colour, update=False) | |
494 | 501 | |
495 | - if self.current_mask.is_shown: | |
496 | - self.blend_filter.SetOpacity(1, self.current_mask.opacity) | |
497 | - else: | |
498 | - self.blend_filter.SetOpacity(1, 0) | |
499 | - self.blend_filter.Update() | |
502 | + self.buffer_slices = {"AXIAL": [-1, None, None], | |
503 | + "CORONAL": [-1,None, None], | |
504 | + "SAGITAL": [-1, None, None]} | |
500 | 505 | |
501 | - ps.Publisher().sendMessage('Set mask threshold in notebook', | |
502 | - (index, | |
503 | - self.current_mask.threshold_range)) | |
504 | - ps.Publisher().sendMessage('Set threshold values in gradient', | |
505 | - self.current_mask.threshold_range) | |
506 | - ps.Publisher().sendMessage('Select mask name in combo', index) | |
507 | - ps.Publisher().sendMessage('Update slice viewer') | |
506 | + ps.Publisher().sendMessage('Set mask threshold in notebook', | |
507 | + (index, | |
508 | + self.current_mask.threshold_range)) | |
509 | + ps.Publisher().sendMessage('Set threshold values in gradient', | |
510 | + self.current_mask.threshold_range) | |
511 | + ps.Publisher().sendMessage('Select mask name in combo', index) | |
512 | + ps.Publisher().sendMessage('Update slice viewer') | |
508 | 513 | #--------------------------------------------------------------------------- |
509 | 514 | |
510 | 515 | def CreateSurfaceFromIndex(self, pubsub_evt): | ... | ... |