Commit 6bdbe8bf338ad87333cce304ac91fa5ea7357f6d
1 parent
8bdc2a60
Exists in
master
and in
56 other branches
Added mida contour to invesalius (only to test yet)
Showing
2 changed files
with
57 additions
and
9 deletions
Show diff stats
invesalius/data/slice_.py
@@ -33,6 +33,7 @@ import utils | @@ -33,6 +33,7 @@ import utils | ||
33 | 33 | ||
34 | from mask import Mask | 34 | from mask import Mask |
35 | from project import Project | 35 | from project import Project |
36 | +from data import mips | ||
36 | 37 | ||
37 | OTHER=0 | 38 | OTHER=0 |
38 | PLIST=1 | 39 | PLIST=1 |
@@ -83,6 +84,9 @@ class Slice(object): | @@ -83,6 +84,9 @@ class Slice(object): | ||
83 | self.blend_filter = None | 84 | self.blend_filter = None |
84 | self.histogram = None | 85 | self.histogram = None |
85 | self._matrix = None | 86 | self._matrix = None |
87 | + | ||
88 | + self._type_projection = 'MIDA CONTOUR' | ||
89 | + | ||
86 | self.spacing = (1.0, 1.0, 1.0) | 90 | self.spacing = (1.0, 1.0, 1.0) |
87 | 91 | ||
88 | self.number_of_colours = 256 | 92 | self.number_of_colours = 256 |
@@ -421,12 +425,14 @@ class Slice(object): | @@ -421,12 +425,14 @@ class Slice(object): | ||
421 | self.buffer_slices[orientation].discard_vtk_mask() | 425 | self.buffer_slices[orientation].discard_vtk_mask() |
422 | 426 | ||
423 | 427 | ||
424 | - def GetSlices(self, orientation, slice_number): | ||
425 | - if self.buffer_slices[orientation].index == slice_number: | 428 | + def GetSlices(self, orientation, slice_number, number_slices): |
429 | + if self.buffer_slices[orientation].index == slice_number and \ | ||
430 | + self._type_projection == 'NORMAL': | ||
426 | if self.buffer_slices[orientation].vtk_image: | 431 | if self.buffer_slices[orientation].vtk_image: |
427 | image = self.buffer_slices[orientation].vtk_image | 432 | image = self.buffer_slices[orientation].vtk_image |
428 | else: | 433 | else: |
429 | - n_image = self.get_image_slice(orientation, slice_number) | 434 | + n_image = self.get_image_slice(orientation, slice_number, |
435 | + number_slices) | ||
430 | image = converters.to_vtk(n_image, self.spacing, slice_number, orientation) | 436 | image = converters.to_vtk(n_image, self.spacing, slice_number, orientation) |
431 | ww_wl_image = self.do_ww_wl(image) | 437 | ww_wl_image = self.do_ww_wl(image) |
432 | image = self.do_colour_image(ww_wl_image) | 438 | image = self.do_colour_image(ww_wl_image) |
@@ -446,7 +452,8 @@ class Slice(object): | @@ -446,7 +452,8 @@ class Slice(object): | ||
446 | final_image = image | 452 | final_image = image |
447 | self.buffer_slices[orientation].vtk_image = image | 453 | self.buffer_slices[orientation].vtk_image = image |
448 | else: | 454 | else: |
449 | - n_image = self.get_image_slice(orientation, slice_number) | 455 | + n_image = self.get_image_slice(orientation, slice_number, |
456 | + number_slices) | ||
450 | image = converters.to_vtk(n_image, self.spacing, slice_number, orientation) | 457 | image = converters.to_vtk(n_image, self.spacing, slice_number, orientation) |
451 | ww_wl_image = self.do_ww_wl(image) | 458 | ww_wl_image = self.do_ww_wl(image) |
452 | image = self.do_colour_image(ww_wl_image) | 459 | image = self.do_colour_image(ww_wl_image) |
@@ -469,17 +476,44 @@ class Slice(object): | @@ -469,17 +476,44 @@ class Slice(object): | ||
469 | 476 | ||
470 | return final_image | 477 | return final_image |
471 | 478 | ||
472 | - def get_image_slice(self, orientation, slice_number): | 479 | + def get_image_slice(self, orientation, slice_number, number_slices=1): |
473 | if self.buffer_slices[orientation].index == slice_number \ | 480 | if self.buffer_slices[orientation].index == slice_number \ |
474 | and self.buffer_slices[orientation].image is not None: | 481 | and self.buffer_slices[orientation].image is not None: |
475 | n_image = self.buffer_slices[orientation].image | 482 | n_image = self.buffer_slices[orientation].image |
476 | else: | 483 | else: |
477 | if orientation == 'AXIAL': | 484 | if orientation == 'AXIAL': |
478 | - n_image = numpy.array(self.matrix[slice_number]) | 485 | + if self._type_projection == 'MIDA CONTOUR': |
486 | + tmp_array = numpy.array(self.matrix[slice_number: | ||
487 | + slice_number + number_slices]) | ||
488 | + n_image = numpy.empty(shape=(tmp_array.shape[1], | ||
489 | + tmp_array.shape[2]), | ||
490 | + dtype=tmp_array.dtype) | ||
491 | + mips.fast_countour_mip(tmp_array, 0.2, 0, self.window_level, | ||
492 | + self.window_level, 2, n_image) | ||
493 | + else: | ||
494 | + n_image = numpy.array(self.matrix[slice_number]) | ||
479 | elif orientation == 'CORONAL': | 495 | elif orientation == 'CORONAL': |
480 | - n_image = numpy.array(self.matrix[..., slice_number, ...]) | 496 | + if self._type_projection == 'MIDA CONTOUR': |
497 | + tmp_array = numpy.array(self.matrix[..., slice_number: | ||
498 | + slice_number + number_slices, ...]) | ||
499 | + n_image = numpy.empty(shape=(tmp_array.shape[0], | ||
500 | + tmp_array.shape[2]), | ||
501 | + dtype=tmp_array.dtype) | ||
502 | + mips.fast_countour_mip(tmp_array, 0.2, 1, self.window_level, | ||
503 | + self.window_level, 2, n_image) | ||
504 | + else: | ||
505 | + n_image = numpy.array(self.matrix[..., slice_number, ...]) | ||
481 | elif orientation == 'SAGITAL': | 506 | elif orientation == 'SAGITAL': |
482 | - n_image = numpy.array(self.matrix[..., ..., slice_number]) | 507 | + if self._type_projection == 'MIDA CONTOUR': |
508 | + tmp_array = numpy.array(self.matrix[..., ..., | ||
509 | + slice_number: slice_number + number_slices]) | ||
510 | + n_image = numpy.empty(shape=(tmp_array.shape[0], | ||
511 | + tmp_array.shape[1]), | ||
512 | + dtype=tmp_array.dtype) | ||
513 | + mips.fast_countour_mip(tmp_array, 0.2, 2, self.window_level, | ||
514 | + self.window_level, 2, n_image) | ||
515 | + else: | ||
516 | + n_image = numpy.array(self.matrix[..., ..., slice_number]) | ||
483 | return n_image | 517 | return n_image |
484 | 518 | ||
485 | def get_mask_slice(self, orientation, slice_number): | 519 | def get_mask_slice(self, orientation, slice_number): |
invesalius/data/viewer_slice.py
@@ -63,6 +63,8 @@ class Viewer(wx.Panel): | @@ -63,6 +63,8 @@ class Viewer(wx.Panel): | ||
63 | #self.modes = []#['DEFAULT'] | 63 | #self.modes = []#['DEFAULT'] |
64 | self.left_pressed = 0 | 64 | self.left_pressed = 0 |
65 | self.right_pressed = 0 | 65 | self.right_pressed = 0 |
66 | + | ||
67 | + self.number_slices = 10 | ||
66 | 68 | ||
67 | self.spined_image = False #Use to control to spin | 69 | self.spined_image = False #Use to control to spin |
68 | self.paned_image = False | 70 | self.paned_image = False |
@@ -1030,6 +1032,17 @@ class Viewer(wx.Panel): | @@ -1030,6 +1032,17 @@ class Viewer(wx.Panel): | ||
1030 | elif (evt.GetKeyCode() == wx.WXK_DOWN and pos < max): | 1032 | elif (evt.GetKeyCode() == wx.WXK_DOWN and pos < max): |
1031 | self.OnScrollBackward() | 1033 | self.OnScrollBackward() |
1032 | self.OnScrollBar() | 1034 | self.OnScrollBar() |
1035 | + | ||
1036 | + elif (evt.GetKeyCode() == wx.WXK_NUMPAD_ADD): | ||
1037 | + self.number_slices += 1 | ||
1038 | + print "ADDing", self.number_slices | ||
1039 | + self.OnScrollBar() | ||
1040 | + | ||
1041 | + elif (evt.GetKeyCode() == wx.WXK_NUMPAD_SUBTRACT): | ||
1042 | + if self.number_slices > 1: | ||
1043 | + self.number_slices -= 1 | ||
1044 | + print "Subtracting", self.number_slices | ||
1045 | + self.OnScrollBar() | ||
1033 | 1046 | ||
1034 | self.UpdateSlice3D(pos) | 1047 | self.UpdateSlice3D(pos) |
1035 | self.interactor.Render() | 1048 | self.interactor.Render() |
@@ -1068,7 +1081,8 @@ class Viewer(wx.Panel): | @@ -1068,7 +1081,8 @@ class Viewer(wx.Panel): | ||
1068 | evt.Skip() | 1081 | evt.Skip() |
1069 | 1082 | ||
1070 | def set_slice_number(self, index): | 1083 | def set_slice_number(self, index): |
1071 | - image = self.slice_.GetSlices(self.orientation, index) | 1084 | + image = self.slice_.GetSlices(self.orientation, index, |
1085 | + self.number_slices) | ||
1072 | self.slice_data.actor.SetInput(image) | 1086 | self.slice_data.actor.SetInput(image) |
1073 | for actor in self.actors_by_slice_number.get(self.slice_data.number, []): | 1087 | for actor in self.actors_by_slice_number.get(self.slice_data.number, []): |
1074 | self.slice_data.renderer.RemoveActor(actor) | 1088 | self.slice_data.renderer.RemoveActor(actor) |