Commit a08353c6a0cad8cfffc77b1f3ff785142ef34427

Authored by tfmoraes
1 parent 7480a7f3

ENH: Window width and level is working again

Showing 1 changed file with 80 additions and 26 deletions   Show diff stats
invesalius/data/slice_.py
@@ -28,6 +28,37 @@ from project import Project @@ -28,6 +28,37 @@ from project import Project
28 import session as ses 28 import session as ses
29 import utils 29 import utils
30 30
  31 +class SliceBuffer(object):
  32 + """
  33 + This class is used as buffer that mantains the vtkImageData and numpy array
  34 + from actual slices from each orientation.
  35 + """
  36 + def __init__(self):
  37 + self.index = -1
  38 + self.image = None
  39 + self.mask = None
  40 + self.vtk_image = None
  41 + self.vtk_mask = None
  42 +
  43 + def discard_vtk_mask(self):
  44 + self.vtk_mask = None
  45 +
  46 + def discard_vtk_image(self):
  47 + self.vtk_image = None
  48 +
  49 + def discard_mask(self):
  50 + self.mask = None
  51 +
  52 + def discard_image(self):
  53 + self.image = None
  54 +
  55 + def discard_buffer(self):
  56 + self.index = -1
  57 + self.image = None
  58 + self.mask = None
  59 + self.vtk_image = None
  60 + self.vtk_mask = None
  61 +
31 62
32 class Slice(object): 63 class Slice(object):
33 __metaclass__= utils.Singleton 64 __metaclass__= utils.Singleton
@@ -41,9 +72,9 @@ class Slice(object): @@ -41,9 +72,9 @@ class Slice(object):
41 self.blend_filter = None 72 self.blend_filter = None
42 self.matrix = None 73 self.matrix = None
43 74
44 - self.buffer_slices = {"AXIAL": [-1, None, None],  
45 - "CORONAL": [-1,None, None],  
46 - "SAGITAL": [-1, None, None]} 75 + self.buffer_slices = {"AXIAL": SliceBuffer(),
  76 + "CORONAL": SliceBuffer(),
  77 + "SAGITAL": SliceBuffer()}
47 78
48 self.num_gradient = 0 79 self.num_gradient = 0
49 self.interaction_style = st.StyleStateManager() 80 self.interaction_style = st.StyleStateManager()
@@ -211,8 +242,9 @@ class Slice(object): @@ -211,8 +242,9 @@ class Slice(object):
211 threshold_range = evt_pubsub.data 242 threshold_range = evt_pubsub.data
212 index = self.current_mask.index 243 index = self.current_mask.index
213 for orientation in self.buffer_slices: 244 for orientation in self.buffer_slices:
  245 + self.buffer_slices[orientation].discard_vtk_mask()
214 self.SetMaskThreshold(index, threshold_range, 246 self.SetMaskThreshold(index, threshold_range,
215 - self.buffer_slices[orientation][0], 247 + self.buffer_slices[orientation].index,
216 orientation) 248 orientation)
217 #Clear edited points 249 #Clear edited points
218 self.current_mask.edited_points = {} 250 self.current_mask.edited_points = {}
@@ -260,13 +292,23 @@ class Slice(object): @@ -260,13 +292,23 @@ class Slice(object):
260 #--------------------------------------------------------------------------- 292 #---------------------------------------------------------------------------
261 293
262 def GetSlices(self, orientation, slice_number): 294 def GetSlices(self, orientation, slice_number):
263 - if self.buffer_slices[orientation][0] == slice_number:  
264 - print "From buffer"  
265 - image = self.buffer_slices[orientation][1] 295 + if self.buffer_slices[orientation].index == slice_number:
  296 + if self.buffer_slices[orientation].vtk_image:
  297 + image = self.buffer_slices[orientation].vtk_image
  298 + else:
  299 + n_image = self.GetImageSlice(orientation, slice_number)
  300 + image = iu.to_vtk(n_image, self.spacing, slice_number, orientation)
  301 + image = self.do_ww_wl(image)
266 if self.current_mask and self.current_mask.is_shown: 302 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)) 303 + if self.buffer_slices[orientation].vtk_mask:
  304 + print "Getting from buffer"
  305 + mask = self.buffer_slices[orientation].vtk_mask
  306 + else:
  307 + print "Do not getting from buffer"
  308 + n_mask = self.GetMaskSlice(orientation, slice_number)
  309 + mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation)
  310 + mask = self.do_colour_mask(mask)
  311 + final_image = self.do_blend(image, mask)
270 else: 312 else:
271 final_image = image 313 final_image = image
272 else: 314 else:
@@ -277,19 +319,25 @@ class Slice(object): @@ -277,19 +319,25 @@ class Slice(object):
277 if self.current_mask and self.current_mask.is_shown: 319 if self.current_mask and self.current_mask.is_shown:
278 n_mask = self.GetMaskSlice(orientation, slice_number) 320 n_mask = self.GetMaskSlice(orientation, slice_number)
279 mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation) 321 mask = iu.to_vtk(n_mask, self.spacing, slice_number, orientation)
280 - final_image = self.do_blend(image, self.do_colour_mask(mask)) 322 + mask = self.do_colour_mask(mask)
  323 + final_image = self.do_blend(image, mask)
281 else: 324 else:
282 n_mask = None 325 n_mask = None
283 final_image = image 326 final_image = image
  327 + mask = None
  328 +
  329 + self.buffer_slices[orientation].index = slice_number
  330 + self.buffer_slices[orientation].image = n_image
  331 + self.buffer_slices[orientation].mask = n_mask
  332 + self.buffer_slices[orientation].vtk_image = image
  333 + self.buffer_slices[orientation].vtk_mask = mask
284 334
285 - self.buffer_slices[orientation] = [slice_number, image, n_mask,  
286 - n_image]  
287 - self.slice_number = slice_number  
288 return final_image 335 return final_image
289 336
290 def GetImageSlice(self, orientation, slice_number): 337 def GetImageSlice(self, orientation, slice_number):
291 - if self.buffer_slices[orientation] == slice_number:  
292 - n_image = self.buffer_slices[orientation][3] 338 + if self.buffer_slices[orientation].index == slice_number \
  339 + and self.buffer_slices[orientation].image is not None:
  340 + n_image = self.buffer_slices[orientation].image
293 else: 341 else:
294 if orientation == 'AXIAL': 342 if orientation == 'AXIAL':
295 n_image = numpy.array(self.matrix[slice_number]) 343 n_image = numpy.array(self.matrix[slice_number])
@@ -307,6 +355,9 @@ class Slice(object): @@ -307,6 +355,9 @@ class Slice(object):
307 # It's necessary because the first position for each dimension from 355 # It's necessary because the first position for each dimension from
308 # mask matrix is used as flags to control if the mask in the 356 # mask matrix is used as flags to control if the mask in the
309 # slice_number position has been generated. 357 # slice_number position has been generated.
  358 + if self.buffer_slices[orientation].index == slice_number \
  359 + and self.buffer_slices[orientation].mask is not None:
  360 + return self.buffer_slices[orientation].mask
310 n = slice_number + 1 361 n = slice_number + 1
311 if orientation == 'AXIAL': 362 if orientation == 'AXIAL':
312 if self.current_mask.matrix[n, 0, 0] == 0: 363 if self.current_mask.matrix[n, 0, 0] == 0:
@@ -413,9 +464,8 @@ class Slice(object): @@ -413,9 +464,8 @@ class Slice(object):
413 self.current_mask.matrix[n+1, 1:, 1:] = m 464 self.current_mask.matrix[n+1, 1:, 1:] = m
414 else: 465 else:
415 print "Only one slice" 466 print "Only one slice"
416 - slice_ = self.buffer_slices[orientation][3]  
417 - self.buffer_slices[orientation][2] = 255 * ((slice_ >= thresh_min) & (slice_ <= thresh_max))  
418 - print self.buffer_slices[orientation][2].dtype 467 + slice_ = self.buffer_slices[orientation].image
  468 + self.buffer_slices[orientation].mask = 255 * ((slice_ >= thresh_min) & (slice_ <= thresh_max))
419 469
420 # Update viewer 470 # Update viewer
421 #ps.Publisher().sendMessage('Update slice viewer') 471 #ps.Publisher().sendMessage('Update slice viewer')
@@ -437,9 +487,9 @@ class Slice(object): @@ -437,9 +487,9 @@ class Slice(object):
437 proj = Project() 487 proj = Project()
438 proj.mask_dict[index].is_shown = value 488 proj.mask_dict[index].is_shown = value
439 if (index == self.current_mask.index): 489 if (index == self.current_mask.index):
440 - self.buffer_slices = {"AXIAL": [-1, None, None],  
441 - "CORONAL": [-1,None, None],  
442 - "SAGITAL": [-1, None, None]} 490 + for buffer_ in self.buffer_slices:
  491 + buffer_.discard_vtk_mask()
  492 + buffer_.discard_mask()
443 ps.Publisher().sendMessage('Reload actual slice') 493 ps.Publisher().sendMessage('Reload actual slice')
444 #--------------------------------------------------------------------------- 494 #---------------------------------------------------------------------------
445 def ErasePixel(self, position): 495 def ErasePixel(self, position):
@@ -498,9 +548,9 @@ class Slice(object): @@ -498,9 +548,9 @@ class Slice(object):
498 print index 548 print index
499 self.SetMaskColour(index, colour, update=False) 549 self.SetMaskColour(index, colour, update=False)
500 550
501 - self.buffer_slices = {"AXIAL": [-1, None, None],  
502 - "CORONAL": [-1,None, None],  
503 - "SAGITAL": [-1, None, None]} 551 + self.buffer_slices = {"AXIAL": SliceBuffer(),
  552 + "CORONAL": SliceBuffer(),
  553 + "SAGITAL": SliceBuffer()}
504 554
505 ps.Publisher().sendMessage('Set mask threshold in notebook', 555 ps.Publisher().sendMessage('Set mask threshold in notebook',
506 (index, 556 (index,
@@ -590,8 +640,12 @@ class Slice(object): @@ -590,8 +640,12 @@ class Slice(object):
590 window, level = pubsub_evt.data 640 window, level = pubsub_evt.data
591 self.window_width = window 641 self.window_width = window
592 self.window_level = level 642 self.window_level = level
  643 +
  644 + for buffer_ in self.buffer_slices.values():
  645 + buffer_.discard_vtk_image()
  646 +
593 ps.Publisher().sendMessage('Reload actual slice') 647 ps.Publisher().sendMessage('Reload actual slice')
594 - ps.Publisher().sendMessage('Update slice viewer') 648 +
595 #window_level = self.window_level 649 #window_level = self.window_level
596 650
597 #if not((window == window_level.GetWindow()) and\ 651 #if not((window == window_level.GetWindow()) and\