Commit a08353c6a0cad8cfffc77b1f3ff785142ef34427
1 parent
7480a7f3
Exists in
master
and in
67 other branches
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 | 28 | import session as ses |
29 | 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 | 63 | class Slice(object): |
33 | 64 | __metaclass__= utils.Singleton |
... | ... | @@ -41,9 +72,9 @@ class Slice(object): |
41 | 72 | self.blend_filter = None |
42 | 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 | 79 | self.num_gradient = 0 |
49 | 80 | self.interaction_style = st.StyleStateManager() |
... | ... | @@ -211,8 +242,9 @@ class Slice(object): |
211 | 242 | threshold_range = evt_pubsub.data |
212 | 243 | index = self.current_mask.index |
213 | 244 | for orientation in self.buffer_slices: |
245 | + self.buffer_slices[orientation].discard_vtk_mask() | |
214 | 246 | self.SetMaskThreshold(index, threshold_range, |
215 | - self.buffer_slices[orientation][0], | |
247 | + self.buffer_slices[orientation].index, | |
216 | 248 | orientation) |
217 | 249 | #Clear edited points |
218 | 250 | self.current_mask.edited_points = {} |
... | ... | @@ -260,13 +292,23 @@ class Slice(object): |
260 | 292 | #--------------------------------------------------------------------------- |
261 | 293 | |
262 | 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 | 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 | 312 | else: |
271 | 313 | final_image = image |
272 | 314 | else: |
... | ... | @@ -277,19 +319,25 @@ class Slice(object): |
277 | 319 | if self.current_mask and self.current_mask.is_shown: |
278 | 320 | n_mask = self.GetMaskSlice(orientation, slice_number) |
279 | 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 | 324 | else: |
282 | 325 | n_mask = None |
283 | 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 | 335 | return final_image |
289 | 336 | |
290 | 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 | 341 | else: |
294 | 342 | if orientation == 'AXIAL': |
295 | 343 | n_image = numpy.array(self.matrix[slice_number]) |
... | ... | @@ -307,6 +355,9 @@ class Slice(object): |
307 | 355 | # It's necessary because the first position for each dimension from |
308 | 356 | # mask matrix is used as flags to control if the mask in the |
309 | 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 | 361 | n = slice_number + 1 |
311 | 362 | if orientation == 'AXIAL': |
312 | 363 | if self.current_mask.matrix[n, 0, 0] == 0: |
... | ... | @@ -413,9 +464,8 @@ class Slice(object): |
413 | 464 | self.current_mask.matrix[n+1, 1:, 1:] = m |
414 | 465 | else: |
415 | 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 | 470 | # Update viewer |
421 | 471 | #ps.Publisher().sendMessage('Update slice viewer') |
... | ... | @@ -437,9 +487,9 @@ class Slice(object): |
437 | 487 | proj = Project() |
438 | 488 | proj.mask_dict[index].is_shown = value |
439 | 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 | 493 | ps.Publisher().sendMessage('Reload actual slice') |
444 | 494 | #--------------------------------------------------------------------------- |
445 | 495 | def ErasePixel(self, position): |
... | ... | @@ -498,9 +548,9 @@ class Slice(object): |
498 | 548 | print index |
499 | 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 | 555 | ps.Publisher().sendMessage('Set mask threshold in notebook', |
506 | 556 | (index, |
... | ... | @@ -590,8 +640,12 @@ class Slice(object): |
590 | 640 | window, level = pubsub_evt.data |
591 | 641 | self.window_width = window |
592 | 642 | self.window_level = level |
643 | + | |
644 | + for buffer_ in self.buffer_slices.values(): | |
645 | + buffer_.discard_vtk_image() | |
646 | + | |
593 | 647 | ps.Publisher().sendMessage('Reload actual slice') |
594 | - ps.Publisher().sendMessage('Update slice viewer') | |
648 | + | |
595 | 649 | #window_level = self.window_level |
596 | 650 | |
597 | 651 | #if not((window == window_level.GetWindow()) and\ | ... | ... |