#============================================================================== # # Project: SharpImage # Module: InitialLevelSetFromMask.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 ImageToImageScript from ImageToImageScript import * # Add reference and import needed libraries clr.AddReference("ManagedITK.ThresholdFilters") clr.AddReference("ManagedITK.IntensityFilters") clr.AddReference("ManagedITK.DistanceMaps") from itk import * class InitialLevelSetFromMaskScript(ImageToImageScriptObject): # ------------------------------------------------------------------------- Name = "InitialLevelSetFromMask" Help = """Generates an initial level set image using spherical mask structures.""" Form = None Selections = None # ------------------------------------------------------------------------- def Run(self): """ The entry-point for this script. """ self.Initialise() # NOTE: DoWork() will be invoked when Continue is clicked. # NOTE: Finalise() will be invoked when FinishedWork() is called. def Initialise(self): """ Initialise the environment for running this script. """ """ NOTE: This function is invoked on the main UI thread. """ ImageToImageScriptObject.Initialise( self ) renderers = List[siRenderer]() renderers.Add( self.Renderer ) self.Form = siFormSelection( renderers ) self.Form.Continue += self.Continue self.Form.Cancel += self.Cancel self.ParentApplication.AddTool( self.Form ) self.ParentApplication.SetApplicationAsReady( 0 ) def ThreadedDoWork(self): """ Perform the main functions of the script on a background thread. """ try: self.StartedWork() self.WriteInputName() # Generate mask image addedPoints = False filterMask = itkGenerateMaskImageFilter.New( self.Output ) self.AddEventHandlersToProcessObject( filterMask ) for selection in self.Selections: if (String.Compare( selection.GenerateMaskImageFilterType, "Ellipse", True ) == 0): self.WriteLineToConsole( selection.ToString() ) filterMask.AddEllipse( selection.Center, selection.Radius ) if (String.Compare( selection.GenerateMaskImageFilterType, "Point", True ) == 0): for point in selection.Points: self.WriteLineToConsole( "Point: " + point.ToString() ) filterMask.AddPoint( point ) addedPoints = True if (String.Compare( selection.GenerateMaskImageFilterType, "Region", True ) == 0): region = selection.ToImageRegion() self.WriteLineToConsole( "Region: " + region.ToString() ) filterMask.AddRegion( region ) if (String.Compare( selection.GenerateMaskImageFilterType, "Image", True ) == 0): if (hasattr(selection, "ToImage")): filterMask.AddImage( selection.ToImage() ) filterMask.Size = self.Input.Size filterMask.Spacing = self.Input.Spacing filterMask.Origin = self.Input.Origin filterMask.Update( ) # Compute signed distance filterDistance = itkSignedMaurerDistanceMapImageFilter.New( self.Output, self.Output ) self.AddEventHandlersToProcessObject( filterDistance ) filterDistance.SquaredDistance = False filterDistance.InsideIsPositive = False filterDistance.UseImageSpacing = True filterDistance.SetInput( filterMask.GetOutput() ) filterDistance.Update( ) # Adjust for points filterShift = None if (addedPoints): filterShift = itkShiftScaleImageFilter.New( self.Output, self.Output ) self.AddEventHandlersToProcessObject( filterShift ) filterShift.SetInput( filterDistance.GetOutput() ) filterShift.Shift = -1.0 filterShift.UpdateLargestPossibleRegion() filterShift.GetOutput( self.Output ) else: filterDistance.GetOutput( self.Output ) # Clean up self.DisconnectInputAndOutput() self.DisposeOfObject( filterMask ) self.DisposeOfObject( filterDistance ) self.DisposeOfObject( filterShift ) self.WriteOutputName() self.UnregisterEventHandlers() self.FinishedWork( True ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def Continue(self, sender, args): """ Allow processing to continue. """ self.Selections = self.Form.Selections self.DoWork() def Cancel(self, sender, args): """ Cancel the script. """ self.UnregisterEventHandlers() ScriptObject.Finalise( self ) def UnregisterEventHandlers(self): """ Unregister all the event handlers. """ if (self.Form != None): self.Form.Continue -= self.Continue self.Form.Cancel -= self.Cancel self.Form = None