Commit eead43d517b427aecc929d52c37b41fa1c6ac599
1 parent
c010bda2
Exists in
master
and in
47 other branches
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 | 16 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais |
17 | 17 | # detalhes. |
18 | 18 | #-------------------------------------------------------------------------- |
19 | -import math | |
20 | 19 | import os |
21 | 20 | import tempfile |
22 | 21 | |
... | ... | @@ -79,7 +78,6 @@ class Slice(object): |
79 | 78 | # Therefore, we use Singleton design pattern for implementing it. |
80 | 79 | |
81 | 80 | def __init__(self): |
82 | - self.imagedata = None | |
83 | 81 | self.current_mask = None |
84 | 82 | self.blend_filter = None |
85 | 83 | self.histogram = None |
... | ... | @@ -249,7 +247,6 @@ class Slice(object): |
249 | 247 | self.CloseProject() |
250 | 248 | |
251 | 249 | def CloseProject(self): |
252 | - self.imagedata = None | |
253 | 250 | f = self._matrix.filename |
254 | 251 | self._matrix._mmap.close() |
255 | 252 | self._matrix = None |
... | ... | @@ -836,19 +833,12 @@ class Slice(object): |
836 | 833 | |
837 | 834 | def SelectCurrentMask(self, index): |
838 | 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 | 836 | proj = Project() |
845 | 837 | future_mask = proj.GetMask(index) |
846 | 838 | future_mask.is_shown = True |
847 | 839 | self.current_mask = future_mask |
848 | 840 | |
849 | 841 | colour = future_mask.colour |
850 | - #index = future_mask.index | |
851 | - print index | |
852 | 842 | self.SetMaskColour(index, colour, update=False) |
853 | 843 | |
854 | 844 | self.buffer_slices = {"AXIAL": SliceBuffer(), |
... | ... | @@ -871,18 +861,9 @@ class Slice(object): |
871 | 861 | proj = Project() |
872 | 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 | 867 | def GetOutput(self): |
887 | 868 | return self.blend_filter.GetOutput() |
888 | 869 | |
... | ... | @@ -906,59 +887,6 @@ class Slice(object): |
906 | 887 | |
907 | 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 | 890 | def UpdateWindowLevelBackground(self, pubsub_evt): |
963 | 891 | window, level = pubsub_evt.data |
964 | 892 | self.window_width = window |
... | ... | @@ -1030,15 +958,12 @@ class Slice(object): |
1030 | 958 | cast.ClampOverflowOn() |
1031 | 959 | cast.Update() |
1032 | 960 | |
1033 | - #if (original_orientation == const.AXIAL): | |
1034 | 961 | flip = vtk.vtkImageFlip() |
1035 | 962 | flip.SetInput(cast.GetOutput()) |
1036 | 963 | flip.SetFilteredAxis(1) |
1037 | 964 | flip.FlipAboutOriginOn() |
1038 | 965 | flip.Update() |
1039 | 966 | widget.SetInput(flip.GetOutput()) |
1040 | - #else: | |
1041 | - #widget.SetInput(cast.GetOutput()) | |
1042 | 967 | |
1043 | 968 | def UpdateSlice3D(self, pubsub_evt): |
1044 | 969 | widget, orientation = pubsub_evt.data |
... | ... | @@ -1111,27 +1036,6 @@ class Slice(object): |
1111 | 1036 | Publisher.sendMessage('Change mask selected', mask.index) |
1112 | 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 | 1039 | def do_ww_wl(self, image): |
1136 | 1040 | if self.from_ == PLIST: |
1137 | 1041 | lut = vtk.vtkWindowLevelLookupTable() |
... | ... | @@ -1212,12 +1116,16 @@ class Slice(object): |
1212 | 1116 | m[mask == 254] = 254 |
1213 | 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 | 1129 | for n in xrange(1, mask.matrix.shape[0]): |
1222 | 1130 | if mask.matrix[n, 0, 0] == 0: |
1223 | 1131 | m = mask.matrix[n, 1:, 1:] |
... | ... | @@ -1390,76 +1298,9 @@ class Slice(object): |
1390 | 1298 | self.buffer_slices[o].discard_vtk_mask() |
1391 | 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 | 1301 | def _open_image_matrix(self, filename, shape, dtype): |
1459 | 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 | 1305 | def OnFlipVolume(self, pubsub_evt): |
1465 | 1306 | axis = pubsub_evt.data |
... | ... | @@ -1489,8 +1330,9 @@ class Slice(object): |
1489 | 1330 | print type(self.matrix) |
1490 | 1331 | |
1491 | 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) | ... | ... |