#============================================================================== # # Project: SharpImage # Module: ValueEdgeHistogram.py # Language: IronPython # Author: Dan Mueller # $Date: 2007-07-06 10:57:00 +1000 (Fri, 06 Jul 2007) $ # $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.Statistics") clr.AddReference("ManagedITK.Filtering.Intensity") clr.AddReference("ManagedITK.Image.Transform") from itk import * class ValueEdgeHistogramScript(ImageToImageScriptObject): # ------------------------------------------------------------------------- Name = "ValueEdgeHistogram" Help = """Computes a joint histogram between a value and edge strength image.""" Parameters = """(string) Value = the name search pattern for the value input. (\"Value\") (string) Edge = the name search pattern for the edge strength input. (\"Magnitude\") (List) NumberOfBins = The number of histogram bins. ([256,128])""" Value = String( "Value" ) Edge = String( "Magnitude" ) NumberOfBins = [256, 128] # ------------------------------------------------------------------------- def Initialise(self): """ Initialise the environment for running this script. """ """ NOTE: This function is invoked on the main UI thread. """ try: # Initialise the base class ThreadedScriptObject.Initialise( self ) # Get Renderer self.Renderer = self.ParentApplication.CurrentRenderer # Search for the input images self.Value = self.GetOpenImageMatchingPattern( self.Value ) self.Edge = self.GetOpenImageMatchingPattern( self.Edge ) if (self.Value == None): raise FileNotFoundException( "Could not find Value." ) if (self.Edge == None): raise FileNotFoundException( "Could not find Edge." ) # Check that both Value and Edge are real types if (not self.Value.PixelType.IsReal): raise ApplicationException( "The Value image must have a real pixel type (eg. float)." ) if (not self.Edge.PixelType.IsReal): raise ApplicationException( "The Edge image must have a real pixel type (eg. float)." ) # Ensure the input requested regions are largest possible self.Value.RequestedRegion = self.Value.LargestPossibleRegion self.Edge.RequestedRegion = self.Edge.LargestPossibleRegion # Create the output image self.Output = itkImage_UC2.New() except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( ) def ThreadedDoWork(self): """ Perform the main functions of the script on a background thread. """ try: # Setup self.StartedWork() self.Input = self.Value; self.WriteImageName( "Value=", self.Value ) self.WriteImageName( "Edge=", self.Edge ) # Write NumberOfBins self.WriteLineToConsole( "NumberOfBins=" + self.ArrayToString(self.NumberOfBins) ); # Compute histogram histogram = itkImage.New( self.Value.PixelType, 2 ) filterJointHistogram = itkJointHistogramImageFilter.New( self.Value, histogram ) self.AddEventHandlersToProcessObject( filterJointHistogram ) filterJointHistogram.SetInput( 0, self.Value ) filterJointHistogram.SetInput( 1, self.Edge ) filterJointHistogram.NumberOfBins = System.Array[UInt32]( self.NumberOfBins ) filterJointHistogram.MarginalScale = 1.0 filterJointHistogram.Mapping = HistogramToImageMappingEnum.LogProbability # Rescale intensity filterRescale = itkRescaleIntensityImageFilter.New( histogram, self.Output ) self.AddEventHandlersToProcessObject( filterRescale ) filterRescale.SetInput( filterJointHistogram.GetOutput() ) filterRescale.OutputMinimum = itkPixel_UC.NewMin( ) filterRescale.OutputMaximum = itkPixel_UC.NewMax( ) # Invert intensity filterInvert = itkInvertIntensityImageFilter.New( self.Output, self.Output ) self.AddEventHandlersToProcessObject( filterInvert ) filterInvert.SetInput( filterRescale.GetOutput() ) # Flip Y-axis filterFlip = itkFlipImageFilter.New( self.Output ) self.AddEventHandlersToProcessObject( filterFlip ) filterFlip.SetInput( filterInvert.GetOutput() ) filterFlip.FlipAxes = System.Array[Boolean]( [False,True] ) filterFlip.GetOutput( self.Output ) filterFlip.UpdateLargestPossibleRegion() # Finish up self.Value.DisconnectPipeline() self.Edge.DisconnectPipeline() self.Output.DisconnectPipeline() self.DisposeOfObject( filterJointHistogram ) self.DisposeOfObject( filterRescale ) self.DisposeOfObject( filterInvert ) self.DisposeOfObject( filterFlip ) self.WriteOutputName( ) self.FinishedWork( True ) except Exception, ex: self.HandleException( ex ) self.FinishedWork( False ) self.Finalise( )