#============================================================================== # # Project: SharpImage # Module: Skeletonize.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 required libraries clr.AddReference("ManagedITK.Image.Topology") clr.AddReference("ManagedITK.Image.DistanceMap") clr.AddReference("ManagedITK.Filtering.Threshold") clr.AddReference("ManagedITK.Image.Cast") from itk import * class SkeletonizeScript(ImageToImageScriptObject): # ------------------------------------------------------------------------- Name = "Skeletonize" Help = """Computes the skeleton of an image using homotopic thinning.""" Parameters = """None""" OrderingImage = None # ------------------------------------------------------------------------- def Initialise(self): """ Initialise the environment for running this script. """ """ NOTE: This function is invoked on the main UI thread. """ try: ImageToImageScriptObject.Initialise( self ) self.OrderingImage = itkImage.New( self.Input ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) ScriptObject.Finalise( self ) def ThreadedDoWork(self): """ Perform the main functions of the script. """ """ NOTE: This function is invoked on a background thread. """ try: self.StartedWork() self.WriteInputName() # Compute order filterDistance = itkChamferDistanceTransformImageFilter.New( self.Input, self.Input ) self.AddEventHandlersToProcessObject( filterDistance ) filterDistance.SetInput( self.Input ) filterDistance.DistanceFromObject = False filterDistance.SetWeight(0, itkPixel(self.Output.PixelType, 3) ) filterDistance.SetWeight(1, itkPixel(self.Output.PixelType, 4) ) if (self.Input.Dimension == 3): filterDistance.SetWeight(2, itkPixel(self.Output.PixelType, 5) ) filterDistance.UpdateLargestPossibleRegion() filterDistance.GetOutput( self.OrderingImage ) self.OrderingImage.DisconnectPipeline() # Compute skeleton filterSkeletonize = itkSkeletonizeImageFilter.New( self.Input, self.Input ) self.AddEventHandlersToProcessObject( filterSkeletonize ) filterSkeletonize.SetInput( self.Input ) filterSkeletonize.SetOrderingImage( self.OrderingImage ) filterSkeletonize.UpdateLargestPossibleRegion() filterSkeletonize.GetOutput( self.Output ) self.Input.DisconnectPipeline() self.Output.DisconnectPipeline() self.OrderingImage.DisconnectPipeline() self.DisposeOfObject( filterDistance ) self.DisposeOfObject( filterSkeletonize ) self.WriteOutputName() self.FinishedWork( True ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def Finalise(self): """ Finalise the environment after running this script. """ """ NOTE: This function is invoked on the main UI thread. """ try: # Show renderer for the ordering image self.OrderingImage.Name = self.Input.Name + " (Ordering)" rendererOrdering = siGdiSliceRenderer( self.ParentApplication ) rendererOrdering.Inputs.Add( self.OrderingImage ) rendererOrdering.Initialise() self.ParentApplication.ShowRenderer( rendererOrdering ) # Let ImageToImageScript show the output ImageToImageScriptObject.Finalise( self ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) ScriptObject.Finalise( self )