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) |