Commit 7c80274f085e948751ea02c174aa811faa07e4b7
1 parent
8d9b272f
Exists in
measure
Reading and applying osirix preset colours
Showing
4 changed files
with
97 additions
and
23 deletions
Show diff stats
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 | ... | ... |