From 7c80274f085e948751ea02c174aa811faa07e4b7 Mon Sep 17 00:00:00 2001 From: Thiago Franco de Moraes Date: Thu, 11 Apr 2013 16:56:24 -0300 Subject: [PATCH] Reading and applying osirix preset colours --- invesalius/constants.py | 2 +- invesalius/data/slice_.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------- invesalius/gui/widgets/slice_menu.py | 14 ++++++++++++++ invesalius/presets.py | 25 +++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 23 deletions(-) diff --git a/invesalius/constants.py b/invesalius/constants.py index 3dfc5df..610c3bd 100644 --- a/invesalius/constants.py +++ b/invesalius/constants.py @@ -295,7 +295,7 @@ WINDOW_LEVEL = {_("Abdomen"):(350,50), REDUCE_IMAGEDATA_QUALITY = 0 ICON_DIR = os.path.abspath(os.path.join('..', 'icons')) -SAMPLE_DIR = os.path.abspath(os.path.join('..', 'samples')) +SAMPLE_DIR = "/usr/share/doc/invesalius-examples/examples/" DOC_DIR = os.path.abspath(os.path.join('..', 'docs')) diff --git a/invesalius/data/slice_.py b/invesalius/data/slice_.py index 6be41e9..65e3f6d 100644 --- a/invesalius/data/slice_.py +++ b/invesalius/data/slice_.py @@ -94,6 +94,8 @@ class Slice(object): self.num_gradient = 0 self.interaction_style = st.StyleStateManager() + self.from_plist = False + self.__bind_events() def __bind_events(self): @@ -125,6 +127,9 @@ class Slice(object): Publisher.subscribe(self.UpdateColourTableBackground,\ 'Change colour table from background image') + Publisher.subscribe(self.UpdateColourTableBackgroundPlist,\ + 'Change colour table from background image from plist') + Publisher.subscribe(self.InputImageWidget, 'Input Image in the widget') Publisher.subscribe(self.OnExportMask,'Export mask to file') @@ -702,6 +707,7 @@ class Slice(object): def UpdateColourTableBackground(self, pubsub_evt): values = pubsub_evt.data + self.from_plist = False self.number_of_colours= values[0] self.saturation_range = values[1] self.hue_range = values[2] @@ -710,6 +716,13 @@ class Slice(object): buffer_.discard_vtk_image() Publisher.sendMessage('Reload actual slice') + def UpdateColourTableBackgroundPlist(self, pubsub_evt): + self.values = pubsub_evt.data + self.from_plist = True + for buffer_ in self.buffer_slices.values(): + buffer_.discard_vtk_image() + Publisher.sendMessage('Reload actual slice') + def InputImageWidget(self, pubsub_evt): widget, orientation = pubsub_evt.data @@ -816,12 +829,31 @@ class Slice(object): Publisher.sendMessage('Update slice viewer') def do_ww_wl(self, image): - colorer = vtk.vtkImageMapToWindowLevelColors() - colorer.SetInput(image) - colorer.SetWindow(self.window_width) - colorer.SetLevel(self.window_level) - colorer.SetOutputFormatToRGB() - colorer.Update() + if self.from_plist: + lut = vtk.vtkWindowLevelLookupTable() + lut.SetWindow(self.window_width) + lut.SetLevel(self.window_level) + lut.Build() + + i = 0 + for r, g, b in self.values: + lut.SetTableValue(i, r/255.0, g/255.0, b/255.0, 1.0) + i += 1 + + print i, r, g, b + + colorer = vtk.vtkImageMapToColors() + colorer.SetInput(image) + colorer.SetLookupTable(lut) + colorer.SetOutputFormatToRGB() + colorer.Update() + else: + colorer = vtk.vtkImageMapToWindowLevelColors() + colorer.SetInput(image) + colorer.SetWindow(self.window_width) + colorer.SetLevel(self.window_level) + colorer.SetOutputFormatToRGB() + colorer.Update() return colorer.GetOutput() @@ -837,22 +869,25 @@ class Slice(object): return m.astype('uint8') def do_colour_image(self, imagedata): - # map scalar values into colors - lut_bg = vtk.vtkLookupTable() - lut_bg.SetTableRange(imagedata.GetScalarRange()) - lut_bg.SetSaturationRange(self.saturation_range) - lut_bg.SetHueRange(self.hue_range) - lut_bg.SetValueRange(self.value_range) - lut_bg.Build() - - # map the input image through a lookup table - img_colours_bg = vtk.vtkImageMapToColors() - img_colours_bg.SetOutputFormatToRGB() - img_colours_bg.SetLookupTable(lut_bg) - img_colours_bg.SetInput(imagedata) - img_colours_bg.Update() - - return img_colours_bg.GetOutput() + if self.from_plist: + return imagedata + else: + # map scalar values into colors + lut_bg = vtk.vtkLookupTable() + lut_bg.SetTableRange(imagedata.GetScalarRange()) + lut_bg.SetSaturationRange(self.saturation_range) + lut_bg.SetHueRange(self.hue_range) + lut_bg.SetValueRange(self.value_range) + lut_bg.Build() + + # map the input image through a lookup table + img_colours_bg = vtk.vtkImageMapToColors() + img_colours_bg.SetOutputFormatToRGB() + img_colours_bg.SetLookupTable(lut_bg) + img_colours_bg.SetInput(imagedata) + img_colours_bg.Update() + + return img_colours_bg.GetOutput() def do_colour_mask(self, imagedata): scalar_range = int(imagedata.GetScalarRange()[1]) diff --git a/invesalius/gui/widgets/slice_menu.py b/invesalius/gui/widgets/slice_menu.py index 9d4fd4c..7658b21 100644 --- a/invesalius/gui/widgets/slice_menu.py +++ b/invesalius/gui/widgets/slice_menu.py @@ -24,6 +24,7 @@ import sys import wx from wx.lib.pubsub import pub as Publisher import constants as const +import presets class SliceMenu(wx.Menu): def __init__(self): @@ -56,6 +57,7 @@ class SliceMenu(wx.Menu): self.ID_TO_TOOL_ITEM[new_id] = wl_item + #----------- Sub menu of the save and load options --------- #submenu_wl.AppendSeparator() #options = [_("Save current values"), @@ -84,6 +86,13 @@ class SliceMenu(wx.Menu): name, kind=wx.ITEM_RADIO) submenu_pseudo_colours.AppendItem(color_item) self.ID_TO_TOOL_ITEM[new_id] = color_item + + self.plist_presets = presets.get_wwwl_presets() + for name in sorted(self.plist_presets): + new_id = wx.NewId() + color_item = wx.MenuItem(submenu_wl, new_id, name, kind=wx.ITEM_RADIO) + submenu_pseudo_colours.AppendItem(color_item) + self.ID_TO_TOOL_ITEM[new_id] = color_item flag_tiling = False #------------ Sub menu of the image tiling --------------- @@ -160,6 +169,11 @@ class SliceMenu(wx.Menu): Publisher.sendMessage('Change colour table from background image', values) Publisher.sendMessage('Update slice viewer') + elif key in self.plist_presets: + values = presets.get_wwwl_preset_colours(self.plist_presets[key]) + Publisher.sendMessage('Change colour table from background image from plist', values) + Publisher.sendMessage('Update slice viewer') + elif(key in const.IMAGE_TILING.keys()): print "c" values = const.IMAGE_TILING[key] diff --git a/invesalius/presets.py b/invesalius/presets.py index 4ea0acb..7e89ea1 100644 --- a/invesalius/presets.py +++ b/invesalius/presets.py @@ -16,9 +16,12 @@ # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais # detalhes. #-------------------------------------------------------------------------- +import glob import os import plistlib +import constants as const + from wx.lib.pubsub import pub as Publisher from utils import TwoWaysDictionary @@ -164,3 +167,25 @@ class Presets(): self.thresh_ct = TwoWaysDictionary(thresh_ct_new) + +def get_wwwl_presets(): + files = glob.glob(os.path.join('..', 'presets', 'raycasting', 'color_list', '*.plist')) + presets = {} + for f in files: + p = os.path.splitext(os.path.basename(f))[0] + presets[p] = f + return presets + + +def get_wwwl_preset_colours(pfile): + preset = plistlib.readPlist(pfile) + ncolours = len(preset['Blue']) + colours = [] + for i in xrange(ncolours): + r = preset['Red'][i] + g = preset['Green'][i] + b = preset['Blue'][i] + + colours.append((r, g, b)) + + return colours -- libgit2 0.21.2