Commit eead43d517b427aecc929d52c37b41fa1c6ac599

Authored by Thiago Franco de Moraes
1 parent c010bda2

starting to clean slice_.py

Showing 1 changed file with 18 additions and 176 deletions   Show diff stats
invesalius/data/slice_.py
@@ -16,7 +16,6 @@ @@ -16,7 +16,6 @@
16 # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais 16 # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais
17 # detalhes. 17 # detalhes.
18 #-------------------------------------------------------------------------- 18 #--------------------------------------------------------------------------
19 -import math  
20 import os 19 import os
21 import tempfile 20 import tempfile
22 21
@@ -79,7 +78,6 @@ class Slice(object): @@ -79,7 +78,6 @@ class Slice(object):
79 # Therefore, we use Singleton design pattern for implementing it. 78 # Therefore, we use Singleton design pattern for implementing it.
80 79
81 def __init__(self): 80 def __init__(self):
82 - self.imagedata = None  
83 self.current_mask = None 81 self.current_mask = None
84 self.blend_filter = None 82 self.blend_filter = None
85 self.histogram = None 83 self.histogram = None
@@ -249,7 +247,6 @@ class Slice(object): @@ -249,7 +247,6 @@ class Slice(object):
249 self.CloseProject() 247 self.CloseProject()
250 248
251 def CloseProject(self): 249 def CloseProject(self):
252 - self.imagedata = None  
253 f = self._matrix.filename 250 f = self._matrix.filename
254 self._matrix._mmap.close() 251 self._matrix._mmap.close()
255 self._matrix = None 252 self._matrix = None
@@ -836,19 +833,12 @@ class Slice(object): @@ -836,19 +833,12 @@ class Slice(object):
836 833
837 def SelectCurrentMask(self, index): 834 def SelectCurrentMask(self, index):
838 "Insert mask data, based on given index, into pipeline." 835 "Insert mask data, based on given index, into pipeline."
839 - # This condition is not necessary in Linux, only under mac and windows  
840 - # because combobox event is binded when the same item is selected again.  
841 - #if index != self.current_mask.index:  
842 - print "SelectCurrentMask"  
843 - print "index:", index  
844 proj = Project() 836 proj = Project()
845 future_mask = proj.GetMask(index) 837 future_mask = proj.GetMask(index)
846 future_mask.is_shown = True 838 future_mask.is_shown = True
847 self.current_mask = future_mask 839 self.current_mask = future_mask
848 840
849 colour = future_mask.colour 841 colour = future_mask.colour
850 - #index = future_mask.index  
851 - print index  
852 self.SetMaskColour(index, colour, update=False) 842 self.SetMaskColour(index, colour, update=False)
853 843
854 self.buffer_slices = {"AXIAL": SliceBuffer(), 844 self.buffer_slices = {"AXIAL": SliceBuffer(),
@@ -871,18 +861,9 @@ class Slice(object): @@ -871,18 +861,9 @@ class Slice(object):
871 proj = Project() 861 proj = Project()
872 mask = proj.mask_dict[surface_parameters['options']['index']] 862 mask = proj.mask_dict[surface_parameters['options']['index']]
873 863
874 - # This is very important. Do not use masks' imagedata. It would mess up  
875 - # surface quality event when using contour  
876 - #self.SetMaskThreshold(mask.index, threshold)  
877 - for n in xrange(1, mask.matrix.shape[0]):  
878 - if mask.matrix[n, 0, 0] == 0:  
879 - m = mask.matrix[n, 1:, 1:]  
880 - mask.matrix[n, 1:, 1:] = self.do_threshold_to_a_slice(self.matrix[n-1], m) 864 + self.do_threshold_to_all_slices(mask)
  865 + Publisher.sendMessage('Create surface', (self, mask, surface_parameters))
881 866
882 - mask.matrix.flush()  
883 -  
884 - Publisher.sendMessage('Create surface', (self, mask,  
885 - surface_parameters))  
886 def GetOutput(self): 867 def GetOutput(self):
887 return self.blend_filter.GetOutput() 868 return self.blend_filter.GetOutput()
888 869
@@ -906,59 +887,6 @@ class Slice(object): @@ -906,59 +887,6 @@ class Slice(object):
906 887
907 Publisher.sendMessage('Check projection menu', tprojection) 888 Publisher.sendMessage('Check projection menu', tprojection)
908 889
909 - def SetInput(self, imagedata, mask_dict):  
910 - print "SETINPUT!"  
911 - self.imagedata = imagedata  
912 - self.extent = imagedata.GetExtent()  
913 -  
914 - imagedata_bg = self.__create_background(imagedata)  
915 -  
916 - if not mask_dict:  
917 - imagedata_mask = self.__build_mask(imagedata, create=True)  
918 - else:  
919 - self.__load_masks(imagedata, mask_dict)  
920 - imagedata_mask = self.img_colours_mask.GetOutput()  
921 -  
922 - mask_opacity = self.current_mask.opacity  
923 -  
924 - # blend both imagedatas, so it can be inserted into viewer  
925 - blend_filter = vtk.vtkImageBlend()  
926 - blend_filter.SetBlendModeToNormal()  
927 - blend_filter.SetOpacity(0, 1)  
928 - if self.current_mask.is_shown:  
929 - blend_filter.SetOpacity(1, mask_opacity)  
930 - else:  
931 - blend_filter.SetOpacity(1, 0)  
932 - blend_filter.SetInput(0, imagedata_bg)  
933 - blend_filter.SetInput(1, imagedata_mask)  
934 - blend_filter.SetBlendModeToNormal()  
935 - blend_filter.GetOutput().ReleaseDataFlagOn()  
936 - self.blend_filter = blend_filter  
937 -  
938 - self.window_level = vtk.vtkImageMapToWindowLevelColors()  
939 - self.window_level.SetInput(self.imagedata)  
940 -  
941 - def __create_background(self, imagedata):  
942 - thresh_min, thresh_max = imagedata.GetScalarRange()  
943 - Publisher.sendMessage('Update threshold limits list', (thresh_min,  
944 - thresh_max))  
945 -  
946 - # map scalar values into colors  
947 - lut_bg = self.lut_bg = vtk.vtkLookupTable()  
948 - lut_bg.SetTableRange(thresh_min, thresh_max)  
949 - lut_bg.SetSaturationRange(0, 0)  
950 - lut_bg.SetHueRange(0, 0)  
951 - lut_bg.SetValueRange(0, 1)  
952 - lut_bg.Build()  
953 -  
954 - # map the input image through a lookup table  
955 - img_colours_bg = self.img_colours_bg = vtk.vtkImageMapToColors()  
956 - img_colours_bg.SetOutputFormatToRGBA()  
957 - img_colours_bg.SetLookupTable(lut_bg)  
958 - img_colours_bg.SetInput(imagedata)  
959 -  
960 - return img_colours_bg.GetOutput()  
961 -  
962 def UpdateWindowLevelBackground(self, pubsub_evt): 890 def UpdateWindowLevelBackground(self, pubsub_evt):
963 window, level = pubsub_evt.data 891 window, level = pubsub_evt.data
964 self.window_width = window 892 self.window_width = window
@@ -1030,15 +958,12 @@ class Slice(object): @@ -1030,15 +958,12 @@ class Slice(object):
1030 cast.ClampOverflowOn() 958 cast.ClampOverflowOn()
1031 cast.Update() 959 cast.Update()
1032 960
1033 - #if (original_orientation == const.AXIAL):  
1034 flip = vtk.vtkImageFlip() 961 flip = vtk.vtkImageFlip()
1035 flip.SetInput(cast.GetOutput()) 962 flip.SetInput(cast.GetOutput())
1036 flip.SetFilteredAxis(1) 963 flip.SetFilteredAxis(1)
1037 flip.FlipAboutOriginOn() 964 flip.FlipAboutOriginOn()
1038 flip.Update() 965 flip.Update()
1039 widget.SetInput(flip.GetOutput()) 966 widget.SetInput(flip.GetOutput())
1040 - #else:  
1041 - #widget.SetInput(cast.GetOutput())  
1042 967
1043 def UpdateSlice3D(self, pubsub_evt): 968 def UpdateSlice3D(self, pubsub_evt):
1044 widget, orientation = pubsub_evt.data 969 widget, orientation = pubsub_evt.data
@@ -1111,27 +1036,6 @@ class Slice(object): @@ -1111,27 +1036,6 @@ class Slice(object):
1111 Publisher.sendMessage('Change mask selected', mask.index) 1036 Publisher.sendMessage('Change mask selected', mask.index)
1112 Publisher.sendMessage('Update slice viewer') 1037 Publisher.sendMessage('Update slice viewer')
1113 1038
1114 - def __load_masks(self, imagedata, mask_dict):  
1115 - keys = mask_dict.keys()  
1116 - keys.sort()  
1117 - for key in keys:  
1118 - mask = mask_dict[key]  
1119 -  
1120 - # update gui related to mask  
1121 - utils.debug("__load_masks")  
1122 - utils.debug('THRESHOLD_RANGE %s'% mask.threshold_range)  
1123 - Publisher.sendMessage('Add mask',  
1124 - (mask.index,  
1125 - mask.name,  
1126 - mask.threshold_range,  
1127 - mask.colour))  
1128 -  
1129 - self.current_mask = mask  
1130 - self.__build_mask(imagedata, False)  
1131 -  
1132 - Publisher.sendMessage('Change mask selected', mask.index)  
1133 - Publisher.sendMessage('Update slice viewer')  
1134 -  
1135 def do_ww_wl(self, image): 1039 def do_ww_wl(self, image):
1136 if self.from_ == PLIST: 1040 if self.from_ == PLIST:
1137 lut = vtk.vtkWindowLevelLookupTable() 1041 lut = vtk.vtkWindowLevelLookupTable()
@@ -1212,12 +1116,16 @@ class Slice(object): @@ -1212,12 +1116,16 @@ class Slice(object):
1212 m[mask == 254] = 254 1116 m[mask == 254] = 254
1213 return m.astype('uint8') 1117 return m.astype('uint8')
1214 1118
1215 - def do_threshold_to_all_slices(self):  
1216 - mask = self.current_mask 1119 + def do_threshold_to_all_slices(self, mask=None):
  1120 + """
  1121 + Apply threshold to all slices.
1217 1122
1218 - # This is very important. Do not use masks' imagedata. It would mess up  
1219 - # surface quality event when using contour  
1220 - #self.SetMaskThreshold(mask.index, threshold) 1123 + Params:
  1124 + - mask: the mask where result of the threshold will be stored.If
  1125 + None, it'll be the current mask.
  1126 + """
  1127 + if mask is None:
  1128 + mask = self.current_mask
1221 for n in xrange(1, mask.matrix.shape[0]): 1129 for n in xrange(1, mask.matrix.shape[0]):
1222 if mask.matrix[n, 0, 0] == 0: 1130 if mask.matrix[n, 0, 0] == 0:
1223 m = mask.matrix[n, 1:, 1:] 1131 m = mask.matrix[n, 1:, 1:]
@@ -1390,76 +1298,9 @@ class Slice(object): @@ -1390,76 +1298,9 @@ class Slice(object):
1390 self.buffer_slices[o].discard_vtk_mask() 1298 self.buffer_slices[o].discard_vtk_mask()
1391 Publisher.sendMessage('Reload actual slice') 1299 Publisher.sendMessage('Reload actual slice')
1392 1300
1393 - def __build_mask(self, imagedata, create=True):  
1394 - # create new mask instance and insert it into project  
1395 - if create:  
1396 - self.CreateMask(imagedata=imagedata)  
1397 - current_mask = self.current_mask  
1398 -  
1399 - # properties to be inserted into pipeline  
1400 - scalar_range = int(imagedata.GetScalarRange()[1])  
1401 - r,g,b = current_mask.colour  
1402 -  
1403 - # map scalar values into colors  
1404 - lut_mask = vtk.vtkLookupTable()  
1405 - lut_mask.SetNumberOfTableValues(1)  
1406 - lut_mask.SetNumberOfColors(1)  
1407 - lut_mask.SetHueRange(const.THRESHOLD_HUE_RANGE)  
1408 - lut_mask.SetSaturationRange(1, 1)  
1409 - lut_mask.SetValueRange(1, 1)  
1410 - lut_mask.SetNumberOfTableValues(scalar_range)  
1411 - lut_mask.SetTableValue(1, r, g, b, 1.0)  
1412 - lut_mask.SetTableValue(scalar_range - 1, r, g, b, 1.0)  
1413 - lut_mask.SetRampToLinear()  
1414 - lut_mask.Build()  
1415 - self.lut_mask = lut_mask  
1416 -  
1417 - mask_thresh_imagedata = self.__create_mask_threshold(imagedata)  
1418 -  
1419 - if create:  
1420 - # threshold pipeline  
1421 - current_mask.imagedata.DeepCopy(mask_thresh_imagedata)  
1422 - else:  
1423 - mask_thresh_imagedata = self.current_mask.imagedata  
1424 -  
1425 - # map the input image through a lookup table  
1426 - img_colours_mask = vtk.vtkImageMapToColors()  
1427 - img_colours_mask.SetOutputFormatToRGBA()  
1428 - img_colours_mask.SetLookupTable(lut_mask)  
1429 -  
1430 - img_colours_mask.SetInput(mask_thresh_imagedata)  
1431 -  
1432 - self.img_colours_mask = img_colours_mask  
1433 -  
1434 - return img_colours_mask.GetOutput()  
1435 -  
1436 - def __create_mask_threshold(self, imagedata, threshold_range=None):  
1437 - if not threshold_range:  
1438 - thresh_min, thresh_max = self.current_mask.threshold_range  
1439 - else:  
1440 - thresh_min, thresh_max = threshold_range  
1441 -  
1442 - # flexible threshold  
1443 - img_thresh_mask = vtk.vtkImageThreshold()  
1444 - img_thresh_mask.SetInValue(const.THRESHOLD_INVALUE)  
1445 - img_thresh_mask.SetInput(imagedata)  
1446 - img_thresh_mask.SetOutValue(const.THRESHOLD_OUTVALUE)  
1447 - img_thresh_mask.ThresholdBetween(float(thresh_min), float(thresh_max))  
1448 - img_thresh_mask.Update()  
1449 - self.img_thresh_mask = img_thresh_mask  
1450 -  
1451 - # copy of threshold output  
1452 - imagedata_mask = vtk.vtkImageData()  
1453 - imagedata_mask.DeepCopy(img_thresh_mask.GetOutput())  
1454 - imagedata_mask.Update()  
1455 -  
1456 - return imagedata_mask  
1457 -  
1458 def _open_image_matrix(self, filename, shape, dtype): 1301 def _open_image_matrix(self, filename, shape, dtype):
1459 self.matrix_filename = filename 1302 self.matrix_filename = filename
1460 - print ">>>", filename  
1461 - self.matrix = numpy.memmap(filename, shape=shape, dtype=dtype,  
1462 - mode='r+') 1303 + self.matrix = numpy.memmap(filename, shape=shape, dtype=dtype, mode='r+')
1463 1304
1464 def OnFlipVolume(self, pubsub_evt): 1305 def OnFlipVolume(self, pubsub_evt):
1465 axis = pubsub_evt.data 1306 axis = pubsub_evt.data
@@ -1489,8 +1330,9 @@ class Slice(object): @@ -1489,8 +1330,9 @@ class Slice(object):
1489 print type(self.matrix) 1330 print type(self.matrix)
1490 1331
1491 def OnExportMask(self, pubsub_evt): 1332 def OnExportMask(self, pubsub_evt):
1492 - #imagedata = self.current_mask.imagedata  
1493 - imagedata = self.imagedata  
1494 - filename, filetype = pubsub_evt.data  
1495 - if (filetype == const.FILETYPE_IMAGEDATA):  
1496 - iu.Export(imagedata, filename) 1333 + pass
  1334 + ##imagedata = self.current_mask.imagedata
  1335 + #imagedata = self.imagedata
  1336 + #filename, filetype = pubsub_evt.data
  1337 + #if (filetype == const.FILETYPE_IMAGEDATA):
  1338 + #iu.Export(imagedata, filename)