#============================================================================== # # Project: SharpImage # Module: SigmoidWithForm.py # Language: IronPython # Author: Dan Mueller # Date: $Date: 2007-07-06 10:57:00 +1000 (Fri, 06 Jul 2007) $ # Revision: $Revision: 2 $ # # Copyright (c) Queensland University of Technology (QUT) 2007. # All rights reserved. # # This software is distributed WITHOUT ANY WARRANTY; without even # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the above copyright notices for more information. # #============================================================================== # Import the base script class import SlicePipelineScript from SlicePipelineScript import * # Add reference and import Intensity library clr.AddReference("ManagedITK.IntensityFilters") from itk import * class SigmoidWithFormScript(SlicePipelineScriptObject): # ------------------------------------------------------------------------- Name = "SigmoidWithForm" Help = """Applies the linear sigmoid transform function to each pixel. The Alpha and Beta parameters are specified using sliders.""" Parameters = """(pixel) OutputMinimum = the minimum output value of the function. (pixel) OutputMaximum = the maximum output value of the function. (pixel) SliderMinimum = the minimum slider value. (-max) (pixel) SliderMaximum = the maximum slider value. ( max) (double) Increment = slider value increment. (1.0)""" OutputMinimum = None OutputMaximum = None SliderMinimum = None SliderMaximum = None Increment = 1.0 # ------------------------------------------------------------------------- def AddVariablesToForm(self): """ Add the required variables to the form. """ # Get pixelMin/Max and imageMin/Max image = self.Renderer.Inputs[0] pixelType = image.PixelType pixelMin = pixelType.MinValue pixelMax = pixelType.MaxValue imageMin = pixelMin imageMax = pixelMax if (image.Metadata.ContainsKey("MinimumValueAsD")): imageMin = image.Metadata["MinimumValueAsD"] if (image.Metadata.ContainsKey("MaximumValueAsD")): imageMax = image.Metadata["MaximumValueAsD"] # Compute the OutputMin/Max outputMinimum = None outputMaximum = None if (pixelType.IsChar): # Setup for Char outputMinimum = pixelMin outputMaximum = pixelMax elif (pixelType.IsShort): # Setup for Short outputMinimum = imageMin outputMaximum = imageMax elif (pixelType.IsLong): # Setup for Long outputMinimum = imageMin outputMaximum = imageMax elif (pixelType.IsReal): # Setup for Float or Double outputMinimum = imageMin outputMaximum = imageMax # Set the OutputMin/Max if not specified if (self.OutputMinimum == None): self.OutputMinimum = outputMinimum if (self.OutputMaximum == None): self.OutputMaximum = outputMinimum # Setup SliderMinimum and SliderMaximum if (self.SliderMinimum == None): self.SliderMinimum = -1.0 * Math.Abs( outputMaximum ) if (self.SliderMaximum == None): self.SliderMaximum = outputMaximum # Add variables self.Form.AddVariable( "Alpha", 1.0, self.SliderMinimum, self.SliderMaximum, self.Increment ) self.Form.AddVariable( "Beta", 0.0, self.SliderMinimum, self.SliderMaximum, self.Increment ) def CreatePipeline(self, isSlice): """ Set self.Pipeline to an instance of an itkPipeline. If isSlice is True the events are watched, otherwise events are NOT watched. """ self.Pipeline = itkSigmoidImageFilter.New( self.Input, self.Output ) if (isSlice): self.Pipeline.RemoveAllObservers( ) else: self.AddEventHandlersToProcessObject( self.Pipeline ) def ApplyPipeline(self, isSlice): """ Apply self.Pipeline by setting the input, setting the filter parameters (stored in self.Variables), updating the pipeline, getting the output, and disconnecting the inputs and outputs. If isSlice is True the pipeline is being applied to the current slice only, otherwise the pipeline is being applied to whole image (eg. a 2D or 3D image). """ # Check the pipeline was not null if (self.Pipeline == None): return # Setup the pipeline inputs and parameters self.Pipeline.SetInput( self.Input ) self.Pipeline.Alpha = self.Variables["Alpha"] self.Pipeline.Beta = self.Variables["Beta"] self.Pipeline.OutputMinimum = itkPixel( self.Output.PixelType, self.OutputMinimum ) self.Pipeline.OutputMaximum = itkPixel( self.Output.PixelType, self.OutputMaximum ) # Write the parameters if not isSlice if (not isSlice): self.WriteLineToConsole( "Alpha=" + self.Variables["Alpha"].ToString() ) self.WriteLineToConsole( "Beta=" + self.Variables["Beta"].ToString() ) self.WriteLineToConsole( "OutputMinimum=" + self.OutputMinimum.ToString() ) self.WriteLineToConsole( "OutputMaximum=" + self.OutputMaximum.ToString() ) # Update the pipeline and get output self.Pipeline.Update( ) self.Pipeline.GetOutput( self.Output ) # Set the Min/Max values for the output self.Output.Metadata["MinimumValue"] = self.OutputMinimum self.Output.Metadata["MaximumValue"] = self.OutputMaximum self.Output.Metadata["MinimumValueAsD"] = Convert.ToDouble( self.OutputMinimum ) self.Output.Metadata["MaximumValueAsD"] = Convert.ToDouble( self.OutputMaximum ) # Disconnect inputs/outputs self.Input.DisconnectPipeline( ) self.Output.DisconnectPipeline( )