def createRescale(self): """ Creates the GUI for controlling the rescaling """ box = wx.StaticBox(self, -1, "Preview selected mapping") previewBox = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.preview = PreviewFrame(self, previewsize=(256, 256), scrollbars=False) previewBox.Add(self.preview) self.zslider = wx.Slider(self, value=1, minValue=1, maxValue=1, style=wx.SL_VERTICAL | wx.SL_LABELS | wx.SL_AUTOTICKS) self.zslider.SetHelpText( "Use this slider to select the displayed optical slice.") self.zslider.Bind(wx.EVT_SCROLL, self.onChangeZSlice) previewBox.Add(self.zslider, 1, wx.EXPAND) box = wx.StaticBox(self, -1, "Channel histograms") self.histogramSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.sizer.Add(previewBox, (0, 0), flag=wx.EXPAND | wx.ALL) self.sizer.Add(self.histogramSizer, (2, 0), flag=wx.EXPAND | wx.ALL)
def createRescale(self): """ Creates the GUI for controlling the rescaling """ box = wx.StaticBox(self, -1, "Preview selected mapping") previewBox = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.preview = PreviewFrame(self, previewsize = (256, 256), scrollbars = False) previewBox.Add(self.preview) self.zslider = wx.Slider(self, value = 1, minValue = 1, maxValue = 1, style = wx.SL_VERTICAL | wx.SL_LABELS | wx.SL_AUTOTICKS) self.zslider.SetHelpText("Use this slider to select the displayed optical slice.") self.zslider.Bind(wx.EVT_SCROLL, self.onChangeZSlice) previewBox.Add(self.zslider, 1, wx.EXPAND) box = wx.StaticBox(self, -1, "Channel histograms") self.histogramSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.sizer.Add(previewBox, (0, 0), flag = wx.EXPAND | wx.ALL) self.sizer.Add(self.histogramSizer, (2, 0), flag = wx.EXPAND | wx.ALL)
class RescaleDialog(wx.Dialog): """ Description: A dialog for rescaling a dataset to 8-bit """ def __init__(self, parent): """ Initialize the dialog """ wx.Dialog.__init__(self, parent, -1, 'Select mapping to 8-bit values', size=(640, 480)) self.sizer = wx.GridBagSizer() self.btnsizer = wx.BoxSizer(wx.HORIZONTAL) self.histograms = [] self.dataUnits = [] self.resampleDims = [] self.shift = 0 self.scale = 0 self.taskPanels = Modules.DynamicLoader.getTaskModules() self.createRescale() self.lbl = wx.StaticText( self, -1, """BioImageXD recommends 8-bit images (intensity values between 0 and 255) for most purposes. This tool converts other bit depths to 8-bit.\nUse the histograms below to select how the intensities in your dataset are mapped to the range 0-255, then click "Convert".\nClick "Convert without mapping" to directly use only the values 0-255 in your original dataset for the resulting dataset. """) lblbox = wx.BoxSizer(wx.VERTICAL) hdr = wx.StaticText(self, -1, "Select mapping to 8-bit values", (20, 120)) font = wx.Font(14, wx.SWISS, wx.NORMAL, wx.NORMAL) hdr.SetFont(font) lblbox.Add(hdr) lblbox.Add(self.lbl) self.sizer.Add(lblbox, (1, 0), flag=wx.EXPAND | wx.LEFT | wx.RIGHT) self.sizer.Add(self.btnsizer, (3, 0), flag=wx.EXPAND | wx.RIGHT | wx.LEFT) self.okButton = wx.Button(self, -1, "Convert") self.noScalingButton = wx.Button(self, -1, "Convert without mapping") self.cancelButton = wx.Button(self, -1, "Cancel") self.okButton.Bind(wx.EVT_BUTTON, self.onOkButton) self.noScalingButton.Bind(wx.EVT_BUTTON, self.onNoScaling) self.cancelButton.Bind(wx.EVT_BUTTON, self.onCancelButton) self.btnsizer.Add(self.okButton) self.btnsizer.Add(self.noScalingButton) self.btnsizer.Add(self.cancelButton) self.result = 0 self.SetSizer(self.sizer) self.SetAutoLayout(1) self.sizer.Fit(self) def onNoScaling(self, event): """ Do not use any intensity scaling """ self.result = 1 for i, dataUnit in enumerate(self.dataUnits): ds = dataUnit.getDataSource() ds.setIntensityScale(-1, -1) self.EndModal(wx.ID_OK) def onCancelButton(self, event): """ Cancel the procedure """ self.result = 0 self.EndModal(wx.ID_CANCEL) def onOkButton(self, event): """ Executes the procedure """ for i, dataUnit in enumerate(self.dataUnits): ds = dataUnit.getDataSource() bitdepth = ds.getSingleComponentBitDepth() self.scale = 255.0 / (2**bitdepth - 1) print "Setting intensity scale", self.shift, self.scale ds.setIntensityScale(self.shift, self.scale) ds.resetColorTransferFunction() dataUnit.resetColorTransferFunction() self.result = 1 #self.Close() self.EndModal(wx.ID_OK) def zoomToFit(self): self.preview.zoomToFit() def setDataUnits(self, dataunits): """ Set the dataunits to be resampled """ self.dataUnits = dataunits unitclass = self.taskPanels["Merging"][2].getDataUnit() self.mergeUnit = unitclass("Preview for scaling intensity") for dataUnit in dataunits: #print "Creating histogram for ",dataUnit self.mergeUnit.addSourceDataUnit(dataUnit) x, y, z = dataUnit.getDimensions() ds = dataUnit.getDataSource() minval, maxval = ds.getOriginalScalarRange() #print "Original scalar range = ",minval,maxval self.resampleDims.append(ds.getResampleDimensions()) scale = maxval / 255.0 print "Scale for histograms = ", scale #"Using scale",scale histogram = Histogram.Histogram(self, scale=scale, lowerThreshold=minval, upperThreshold=maxval) self.histogramSizer.Add(histogram) self.histograms.append(histogram) histogram.setThresholdMode(1) histogram.setDataUnit(dataUnit, noupdate=1) lib.messenger.connect(histogram, "threshold_changed", self.onSetThreshold) x, y, z = dataUnit.getDimensions() self.zslider.SetRange(1, z) moduletype = self.taskPanels["Merging"][0] module = moduletype() self.mergeUnit.setModule(module) self.preview.setDataUnit(self.mergeUnit) self.preview.zoomToFit() self.preview.updatePreview() self.sizer.Fit(self) self.Layout() def onSetThreshold(self, obj, event, lower, upper): """ An event handler for updating the thresholds based on one of the histograms """ n = self.histograms.index(obj) dataUnit = self.dataUnits[n] minval, maxval = dataUnit.getDataSource().getOriginalScalarRange() #print "Original scalar range=",minval,maxval if lower == 0 and upper == 255: self.shift = 0 self.scale = 255.0 / maxval else: upper = upper * (maxval / 255.0) lower = lower * (maxval / 255.0) self.shift = -int(lower) self.scale = 255.0 / ((upper - lower)) dataUnit.getDataSource().setIntensityScale(self.shift, self.scale) dataUnit.resetColorTransferFunction() self.preview.updatePreview(1) def createRescale(self): """ Creates the GUI for controlling the rescaling """ box = wx.StaticBox(self, -1, "Preview selected mapping") previewBox = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.preview = PreviewFrame(self, previewsize=(256, 256), scrollbars=False) previewBox.Add(self.preview) self.zslider = wx.Slider(self, value=1, minValue=1, maxValue=1, style=wx.SL_VERTICAL | wx.SL_LABELS | wx.SL_AUTOTICKS) self.zslider.SetHelpText( "Use this slider to select the displayed optical slice.") self.zslider.Bind(wx.EVT_SCROLL, self.onChangeZSlice) previewBox.Add(self.zslider, 1, wx.EXPAND) box = wx.StaticBox(self, -1, "Channel histograms") self.histogramSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.sizer.Add(previewBox, (0, 0), flag=wx.EXPAND | wx.ALL) self.sizer.Add(self.histogramSizer, (2, 0), flag=wx.EXPAND | wx.ALL) def onChangeZSlice(self, event): """ Set the zslice displayed """ self.preview.setZSlice(self.zslider.GetValue() - 1) self.preview.updatePreview(0)
class RescaleDialog(wx.Dialog): """ Description: A dialog for rescaling a dataset to 8-bit """ def __init__(self, parent): """ Initialize the dialog """ wx.Dialog.__init__(self, parent, -1, 'Select mapping to 8-bit values', size = (640, 480)) self.sizer = wx.GridBagSizer() self.btnsizer = wx.BoxSizer(wx.HORIZONTAL) self.histograms = [] self.dataUnits = [] self.resampleDims = [] self.shift = 0 self.scale = 0 self.taskPanels = Modules.DynamicLoader.getTaskModules() self.createRescale() self.lbl = wx.StaticText(self, -1, """BioImageXD recommends 8-bit images (intensity values between 0 and 255) for most purposes. This tool converts other bit depths to 8-bit.\nUse the histograms below to select how the intensities in your dataset are mapped to the range 0-255, then click "Convert".\nClick "Convert without mapping" to directly use only the values 0-255 in your original dataset for the resulting dataset. """) lblbox = wx.BoxSizer(wx.VERTICAL) hdr = wx.StaticText(self, -1, "Select mapping to 8-bit values", (20, 120)) font = wx.Font(14, wx.SWISS, wx.NORMAL, wx.NORMAL) hdr.SetFont(font) lblbox.Add(hdr) lblbox.Add(self.lbl) self.sizer.Add(lblbox, (1, 0), flag = wx.EXPAND | wx.LEFT | wx.RIGHT) self.sizer.Add(self.btnsizer, (3, 0), flag = wx.EXPAND | wx.RIGHT | wx.LEFT) self.okButton = wx.Button(self, -1, "Convert") self.noScalingButton = wx.Button(self, -1, "Convert without mapping") self.cancelButton = wx.Button(self, -1, "Cancel") self.okButton.Bind(wx.EVT_BUTTON, self.onOkButton) self.noScalingButton.Bind(wx.EVT_BUTTON, self.onNoScaling) self.cancelButton.Bind(wx.EVT_BUTTON, self.onCancelButton) self.btnsizer.Add(self.okButton) self.btnsizer.Add(self.noScalingButton) self.btnsizer.Add(self.cancelButton) self.result = 0 self.SetSizer(self.sizer) self.SetAutoLayout(1) self.sizer.Fit(self) def onNoScaling(self, event): """ Do not use any intensity scaling """ self.result = 1 for i, dataUnit in enumerate(self.dataUnits): ds = dataUnit.getDataSource() ds.setIntensityScale(-1, -1) self.EndModal(wx.ID_OK) def onCancelButton(self, event): """ Cancel the procedure """ self.result = 0 self.EndModal(wx.ID_CANCEL) def onOkButton(self, event): """ Executes the procedure """ for i, dataUnit in enumerate(self.dataUnits): ds = dataUnit.getDataSource() bitdepth = ds.getSingleComponentBitDepth() self.scale = 255.0 / (2**bitdepth - 1) print "Setting intensity scale",self.shift,self.scale ds.setIntensityScale(self.shift, self.scale) ds.resetColorTransferFunction() dataUnit.resetColorTransferFunction() self.result = 1 #self.Close() self.EndModal(wx.ID_OK) def zoomToFit(self): self.preview.zoomToFit() def setDataUnits(self, dataunits): """ Set the dataunits to be resampled """ self.dataUnits = dataunits unitclass = self.taskPanels["Merging"][2].getDataUnit() self.mergeUnit = unitclass("Preview for scaling intensity") for dataUnit in dataunits: #print "Creating histogram for ",dataUnit self.mergeUnit.addSourceDataUnit(dataUnit) x, y, z = dataUnit.getDimensions() ds = dataUnit.getDataSource() minval, maxval = ds.getOriginalScalarRange() #print "Original scalar range = ",minval,maxval self.resampleDims.append(ds.getResampleDimensions()) scale = maxval / 255.0 print "Scale for histograms = ",scale #"Using scale",scale histogram = Histogram.Histogram(self, scale = scale, lowerThreshold = minval, upperThreshold = maxval) self.histogramSizer.Add(histogram) self.histograms.append(histogram) histogram.setThresholdMode(1) histogram.setDataUnit(dataUnit, noupdate = 1) lib.messenger.connect(histogram, "threshold_changed", self.onSetThreshold) x, y, z = dataUnit.getDimensions() self.zslider.SetRange(1, z) moduletype = self.taskPanels["Merging"][0] module = moduletype() self.mergeUnit.setModule(module) self.preview.setDataUnit(self.mergeUnit) self.preview.zoomToFit() self.preview.updatePreview() self.sizer.Fit(self) self.Layout() def onSetThreshold(self, obj, event, lower, upper): """ An event handler for updating the thresholds based on one of the histograms """ n = self.histograms.index(obj) dataUnit = self.dataUnits[n] minval, maxval = dataUnit.getDataSource().getOriginalScalarRange() #print "Original scalar range=",minval,maxval if lower == 0 and upper == 255: self.shift = 0 self.scale = 255.0 / maxval else: upper = upper * (maxval / 255.0) lower = lower * (maxval / 255.0) self.shift = -int(lower) self.scale = 255.0 / ((upper - lower)) dataUnit.getDataSource().setIntensityScale(self.shift, self.scale) dataUnit.resetColorTransferFunction() self.preview.updatePreview(1) def createRescale(self): """ Creates the GUI for controlling the rescaling """ box = wx.StaticBox(self, -1, "Preview selected mapping") previewBox = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.preview = PreviewFrame(self, previewsize = (256, 256), scrollbars = False) previewBox.Add(self.preview) self.zslider = wx.Slider(self, value = 1, minValue = 1, maxValue = 1, style = wx.SL_VERTICAL | wx.SL_LABELS | wx.SL_AUTOTICKS) self.zslider.SetHelpText("Use this slider to select the displayed optical slice.") self.zslider.Bind(wx.EVT_SCROLL, self.onChangeZSlice) previewBox.Add(self.zslider, 1, wx.EXPAND) box = wx.StaticBox(self, -1, "Channel histograms") self.histogramSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL) self.sizer.Add(previewBox, (0, 0), flag = wx.EXPAND | wx.ALL) self.sizer.Add(self.histogramSizer, (2, 0), flag = wx.EXPAND | wx.ALL) def onChangeZSlice(self, event): """ Set the zslice displayed """ self.preview.setZSlice(self.zslider.GetValue() - 1) self.preview.updatePreview(0)