/*========================================================================= Program: Insight Segmentation & Registration Toolkit Module: $RCSfile: itkLabelOverlapMeasuresImageFilter.h,v $ Language: C++ Date: $Date: $ Version: $Revision: $ Copyright (c) Insight Software Consortium. All rights reserved. See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. 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. =========================================================================*/ #ifndef __itkLabelOverlapMeasuresImageFilter_h #define __itkLabelOverlapMeasuresImageFilter_h #include "itkImageToImageFilter.h" #include "itkFastMutexLock.h" #include "itkNumericTraits.h" //#include "itk_hash_map.h" #include "itksys/hash_map.hxx" namespace itk { /** \class LabelOverlapMeasuresImageFilter * \brief Computes overlap measures between the set same set of labels of * pixels of two images. Background is assumed to be 0. * * \sa LabelOverlapMeasuresImageFilter * * \ingroup MultiThreaded */ template class ITK_EXPORT LabelOverlapMeasuresImageFilter : public ImageToImageFilter { public: /** Standard Self typedef */ typedef LabelOverlapMeasuresImageFilter Self; typedef ImageToImageFilter Superclass; typedef SmartPointer Pointer; typedef SmartPointer ConstPointer; /** Method for creation through the object factory. */ itkNewMacro( Self ); /** Runtime information support. */ itkTypeMacro( LabelOverlapMeasuresImageFilter, ImageToImageFilter ); virtual void VerifyInputInformation() { } /** Image related typedefs. */ typedef TLabelImage LabelImageType; typedef typename TLabelImage::Pointer LabelImagePointer; typedef typename TLabelImage::ConstPointer LabelImageConstPointer; typedef typename TLabelImage::RegionType RegionType; typedef typename TLabelImage::SizeType SizeType; typedef typename TLabelImage::IndexType IndexType; typedef typename TLabelImage::PixelType LabelType; /** Type to use form computations. */ typedef typename NumericTraits::RealType RealType; /** \class LabelLabelOverlapMeasuress * \brief Metrics stored per label */ class LabelSetMeasures { public: // default constructor LabelSetMeasures() { m_Source = 0; m_Target = 0; m_Union = 0; m_Intersection = 0; m_SourceComplement = 0; m_TargetComplement = 0; } // added for completeness LabelSetMeasures& operator=( const LabelSetMeasures& l ) { m_Source = l.m_Source; m_Target = l.m_Target; m_Union = l.m_Union; m_Intersection = l.m_Intersection; m_SourceComplement = l.m_SourceComplement; m_TargetComplement = l.m_TargetComplement; } unsigned long m_Source; unsigned long m_Target; unsigned long m_Union; unsigned long m_Intersection; unsigned long m_SourceComplement; unsigned long m_TargetComplement; }; /** Type of the map used to store data per label */ typedef itksys::hash_map MapType; typedef typename MapType::iterator MapIterator; typedef typename MapType::const_iterator MapConstIterator; /** Image related typedefs. */ itkStaticConstMacro( ImageDimension, unsigned int, TLabelImage::ImageDimension ); /** Set the source image. */ void SetSourceImage( const LabelImageType * image ) { this->SetNthInput( 0, const_cast( image ) ); } /** Set the target image. */ void SetTargetImage( const LabelImageType * image ) { this->SetNthInput( 1, const_cast( image ) ); } /** Get the source image. */ const LabelImageType * GetSourceImage( void ) { return this->GetInput( 0 ); } /** Get the target image. */ const LabelImageType * GetTargetImage( void ) { return this->GetInput( 1 ); } /** Get the label set measures */ MapType GetLabelSetMeasures() { return this->m_LabelSetMeasures; } /** * tric overlap measures */ /** measures over all labels */ RealType GetTotalOverlap(); RealType GetUnionOverlap(); RealType GetMeanOverlap(); RealType GetVolumeSimilarity(); RealType GetFalseNegativeError(); RealType GetFalsePositiveError(); /** measures over individual labels */ RealType GetTargetOverlap( LabelType ); RealType GetUnionOverlap( LabelType ); RealType GetMeanOverlap( LabelType ); RealType GetVolumeSimilarity( LabelType ); RealType GetFalseNegativeError( LabelType ); RealType GetFalsePositiveError( LabelType ); /** alternative names */ RealType GetJaccardCoefficient() { return this->GetUnionOverlap(); } RealType GetJaccardCoefficient( LabelType label ) { return this->GetUnionOverlap( label ); } RealType GetDiceCoefficient() { return this->GetMeanOverlap(); } RealType GetDiceCoefficient( LabelType label ) { return this->GetMeanOverlap( label ); } #ifdef ITK_USE_CONCEPT_CHECKING /** Begin concept checking */ itkConceptMacro( Input1HasNumericTraitsCheck, ( Concept::HasNumericTraits ) ); /** End concept checking */ #endif protected: LabelOverlapMeasuresImageFilter(); ~LabelOverlapMeasuresImageFilter(){}; void PrintSelf( std::ostream& os, Indent indent ) const; /** * Pass the input through unmodified. Do this by setting the output to the * source this by setting the output to the source image in the * AllocateOutputs() method. */ void AllocateOutputs(); void BeforeThreadedGenerateData(); void AfterThreadedGenerateData(); /** Multi-thread version GenerateData. */ void ThreadedGenerateData( const RegionType&, int ); // Override since the filter needs all the data for the algorithm void GenerateInputRequestedRegion(); // Override since the filter produces all of its output void EnlargeOutputRequestedRegion( DataObject *data ); private: LabelOverlapMeasuresImageFilter( const Self& ); //purposely not implemented void operator=( const Self& ); //purposely not implemented std::vector m_LabelSetMeasuresPerThread; MapType m_LabelSetMeasures; SimpleFastMutexLock m_Mutex; }; // end of class } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION #include "itkLabelOverlapMeasuresImageFilter.txx" #endif #endif