Commit 7c80274f085e948751ea02c174aa811faa07e4b7

Authored by Thiago Franco de Moraes
1 parent 8d9b272f
Exists in measure

Reading and applying osirix preset colours

invesalius/constants.py
... ... @@ -295,7 +295,7 @@ WINDOW_LEVEL = {_("Abdomen"):(350,50),
295 295 REDUCE_IMAGEDATA_QUALITY = 0
296 296  
297 297 ICON_DIR = os.path.abspath(os.path.join('..', 'icons'))
298   -SAMPLE_DIR = os.path.abspath(os.path.join('..', 'samples'))
  298 +SAMPLE_DIR = "/usr/share/doc/invesalius-examples/examples/"
299 299 DOC_DIR = os.path.abspath(os.path.join('..', 'docs'))
300 300  
301 301  
... ...
invesalius/data/slice_.py
... ... @@ -94,6 +94,8 @@ class Slice(object):
94 94 self.num_gradient = 0
95 95 self.interaction_style = st.StyleStateManager()
96 96  
  97 + self.from_plist = False
  98 +
97 99 self.__bind_events()
98 100  
99 101 def __bind_events(self):
... ... @@ -125,6 +127,9 @@ class Slice(object):
125 127 Publisher.subscribe(self.UpdateColourTableBackground,\
126 128 'Change colour table from background image')
127 129  
  130 + Publisher.subscribe(self.UpdateColourTableBackgroundPlist,\
  131 + 'Change colour table from background image from plist')
  132 +
128 133 Publisher.subscribe(self.InputImageWidget, 'Input Image in the widget')
129 134  
130 135 Publisher.subscribe(self.OnExportMask,'Export mask to file')
... ... @@ -702,6 +707,7 @@ class Slice(object):
702 707  
703 708 def UpdateColourTableBackground(self, pubsub_evt):
704 709 values = pubsub_evt.data
  710 + self.from_plist = False
705 711 self.number_of_colours= values[0]
706 712 self.saturation_range = values[1]
707 713 self.hue_range = values[2]
... ... @@ -710,6 +716,13 @@ class Slice(object):
710 716 buffer_.discard_vtk_image()
711 717 Publisher.sendMessage('Reload actual slice')
712 718  
  719 + def UpdateColourTableBackgroundPlist(self, pubsub_evt):
  720 + self.values = pubsub_evt.data
  721 + self.from_plist = True
  722 + for buffer_ in self.buffer_slices.values():
  723 + buffer_.discard_vtk_image()
  724 + Publisher.sendMessage('Reload actual slice')
  725 +
713 726 def InputImageWidget(self, pubsub_evt):
714 727 widget, orientation = pubsub_evt.data
715 728  
... ... @@ -816,12 +829,31 @@ class Slice(object):
816 829 Publisher.sendMessage('Update slice viewer')
817 830  
818 831 def do_ww_wl(self, image):
819   - colorer = vtk.vtkImageMapToWindowLevelColors()
820   - colorer.SetInput(image)
821   - colorer.SetWindow(self.window_width)
822   - colorer.SetLevel(self.window_level)
823   - colorer.SetOutputFormatToRGB()
824   - colorer.Update()
  832 + if self.from_plist:
  833 + lut = vtk.vtkWindowLevelLookupTable()
  834 + lut.SetWindow(self.window_width)
  835 + lut.SetLevel(self.window_level)
  836 + lut.Build()
  837 +
  838 + i = 0
  839 + for r, g, b in self.values:
  840 + lut.SetTableValue(i, r/255.0, g/255.0, b/255.0, 1.0)
  841 + i += 1
  842 +
  843 + print i, r, g, b
  844 +
  845 + colorer = vtk.vtkImageMapToColors()
  846 + colorer.SetInput(image)
  847 + colorer.SetLookupTable(lut)
  848 + colorer.SetOutputFormatToRGB()
  849 + colorer.Update()
  850 + else:
  851 + colorer = vtk.vtkImageMapToWindowLevelColors()
  852 + colorer.SetInput(image)
  853 + colorer.SetWindow(self.window_width)
  854 + colorer.SetLevel(self.window_level)
  855 + colorer.SetOutputFormatToRGB()
  856 + colorer.Update()
825 857  
826 858 return colorer.GetOutput()
827 859  
... ... @@ -837,22 +869,25 @@ class Slice(object):
837 869 return m.astype('uint8')
838 870  
839 871 def do_colour_image(self, imagedata):
840   - # map scalar values into colors
841   - lut_bg = vtk.vtkLookupTable()
842   - lut_bg.SetTableRange(imagedata.GetScalarRange())
843   - lut_bg.SetSaturationRange(self.saturation_range)
844   - lut_bg.SetHueRange(self.hue_range)
845   - lut_bg.SetValueRange(self.value_range)
846   - lut_bg.Build()
847   -
848   - # map the input image through a lookup table
849   - img_colours_bg = vtk.vtkImageMapToColors()
850   - img_colours_bg.SetOutputFormatToRGB()
851   - img_colours_bg.SetLookupTable(lut_bg)
852   - img_colours_bg.SetInput(imagedata)
853   - img_colours_bg.Update()
854   -
855   - return img_colours_bg.GetOutput()
  872 + if self.from_plist:
  873 + return imagedata
  874 + else:
  875 + # map scalar values into colors
  876 + lut_bg = vtk.vtkLookupTable()
  877 + lut_bg.SetTableRange(imagedata.GetScalarRange())
  878 + lut_bg.SetSaturationRange(self.saturation_range)
  879 + lut_bg.SetHueRange(self.hue_range)
  880 + lut_bg.SetValueRange(self.value_range)
  881 + lut_bg.Build()
  882 +
  883 + # map the input image through a lookup table
  884 + img_colours_bg = vtk.vtkImageMapToColors()
  885 + img_colours_bg.SetOutputFormatToRGB()
  886 + img_colours_bg.SetLookupTable(lut_bg)
  887 + img_colours_bg.SetInput(imagedata)
  888 + img_colours_bg.Update()
  889 +
  890 + return img_colours_bg.GetOutput()
856 891  
857 892 def do_colour_mask(self, imagedata):
858 893 scalar_range = int(imagedata.GetScalarRange()[1])
... ...
invesalius/gui/widgets/slice_menu.py
... ... @@ -24,6 +24,7 @@ import sys
24 24 import wx
25 25 from wx.lib.pubsub import pub as Publisher
26 26 import constants as const
  27 +import presets
27 28  
28 29 class SliceMenu(wx.Menu):
29 30 def __init__(self):
... ... @@ -56,6 +57,7 @@ class SliceMenu(wx.Menu):
56 57 self.ID_TO_TOOL_ITEM[new_id] = wl_item
57 58  
58 59  
  60 +
59 61 #----------- Sub menu of the save and load options ---------
60 62 #submenu_wl.AppendSeparator()
61 63 #options = [_("Save current values"),
... ... @@ -84,6 +86,13 @@ class SliceMenu(wx.Menu):
84 86 name, kind=wx.ITEM_RADIO)
85 87 submenu_pseudo_colours.AppendItem(color_item)
86 88 self.ID_TO_TOOL_ITEM[new_id] = color_item
  89 +
  90 + self.plist_presets = presets.get_wwwl_presets()
  91 + for name in sorted(self.plist_presets):
  92 + new_id = wx.NewId()
  93 + color_item = wx.MenuItem(submenu_wl, new_id, name, kind=wx.ITEM_RADIO)
  94 + submenu_pseudo_colours.AppendItem(color_item)
  95 + self.ID_TO_TOOL_ITEM[new_id] = color_item
87 96  
88 97 flag_tiling = False
89 98 #------------ Sub menu of the image tiling ---------------
... ... @@ -160,6 +169,11 @@ class SliceMenu(wx.Menu):
160 169 Publisher.sendMessage('Change colour table from background image', values)
161 170 Publisher.sendMessage('Update slice viewer')
162 171  
  172 + elif key in self.plist_presets:
  173 + values = presets.get_wwwl_preset_colours(self.plist_presets[key])
  174 + Publisher.sendMessage('Change colour table from background image from plist', values)
  175 + Publisher.sendMessage('Update slice viewer')
  176 +
163 177 elif(key in const.IMAGE_TILING.keys()):
164 178 print "c"
165 179 values = const.IMAGE_TILING[key]
... ...
invesalius/presets.py
... ... @@ -16,9 +16,12 @@
16 16 # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais
17 17 # detalhes.
18 18 #--------------------------------------------------------------------------
  19 +import glob
19 20 import os
20 21 import plistlib
21 22  
  23 +import constants as const
  24 +
22 25 from wx.lib.pubsub import pub as Publisher
23 26  
24 27 from utils import TwoWaysDictionary
... ... @@ -164,3 +167,25 @@ class Presets():
164 167 self.thresh_ct = TwoWaysDictionary(thresh_ct_new)
165 168  
166 169  
  170 +
  171 +def get_wwwl_presets():
  172 + files = glob.glob(os.path.join('..', 'presets', 'raycasting', 'color_list', '*.plist'))
  173 + presets = {}
  174 + for f in files:
  175 + p = os.path.splitext(os.path.basename(f))[0]
  176 + presets[p] = f
  177 + return presets
  178 +
  179 +
  180 +def get_wwwl_preset_colours(pfile):
  181 + preset = plistlib.readPlist(pfile)
  182 + ncolours = len(preset['Blue'])
  183 + colours = []
  184 + for i in xrange(ncolours):
  185 + r = preset['Red'][i]
  186 + g = preset['Green'][i]
  187 + b = preset['Blue'][i]
  188 +
  189 + colours.append((r, g, b))
  190 +
  191 + return colours
... ...