]> Creatis software - FrontAlgorithms.git/blobdiff - appli/CTBronchi/MoriLabelling.h
...
[FrontAlgorithms.git] / appli / CTBronchi / MoriLabelling.h
index eecb4ad52910e2aa11df53acea7a1a79cf8a4268..f9adb5ce8ea9de58bd51f22a3dcd9b293bd31372 100644 (file)
 // @author Leonardo Florez Valencia
 // @email florez-l@javeriana.edu.co
 // =========================================================================
-
 #ifndef __CTBronchi__MoriLabelling__h__
 #define __CTBronchi__MoriLabelling__h__
 
-#include <fpa/Base/RegionGrow.h>
-#include <fpa/Base/MarksInterface.h>
-#include <fpa/Base/Functors/RegionGrow/BinaryThreshold.h>
-#include <fpa/Image/Algorithm.h>
-#include <fpa/Image/LabelledSeedsInterface.h>
+#include <itkMinimumMaximumImageCalculator.h>
+#include <fpa/Filters/BaseMarksInterface.h>
+#include <fpa/Filters/Image/SeedsFromLabelsInterface.h>
+#include <fpa/Filters/Image/DefaultTraits.h>
+#include <fpa/Filters/Image/RegionGrow.h>
+#include <fpa/Functors/RegionGrow/BinaryThreshold.h>
 
 namespace CTBronchi
 {
   /**
    */
-  template< class _TInputImage, class _TLabelImage >
-  class MoriLabelling
-    : public fpa::Base::RegionGrow< fpa::Image::Algorithm< _TInputImage, _TLabelImage, fpa::Base::MarksInterface< typename _TInputImage::IndexType >, fpa::Image::LabelledSeedsInterface< typename _TInputImage::IndexType, typename _TInputImage::PointType, typename _TInputImage::PixelType, typename _TLabelImage::PixelType, typename _TLabelImage::PixelType, typename _TInputImage::IndexType::LexicographicCompare > > >
+  template< class _TImage, class _TLabels >
+  class MoriLabellingTraits
+    : public fpa::Filters::Image::DefaultTraits< _TImage, _TLabels, typename _TLabels::PixelType >
   {
   public:
-    typedef _TInputImage TInputImage;
-    typedef _TLabelImage TLabelImage;
-    typedef typename TInputImage::PixelType TInputValue;
-    typedef typename TInputImage::PointType TPoint;
-    typedef typename TInputImage::IndexType TVertex;
-    typedef typename TLabelImage::PixelType TOutputValue;
-    typedef typename TVertex::LexicographicCompare TVertexCompare;
+    typedef fpa::Filters::Image::DefaultTraits< _TImage, _TLabels, typename _TLabels::PixelType > Superclass;
+    typedef typename Superclass::TInternalTraits  TInternalTraits;
+    typedef typename Superclass::TMarksImage      TMarksImage;
+    typedef typename Superclass::TFilterInterface TFilterInterface;
 
-    typedef fpa::Base::MarksInterface< TVertex > TMarksInterface;
-    typedef fpa::Image::LabelledSeedsInterface< TVertex, TPoint, TInputValue, TOutputValue, TOutputValue, TVertexCompare > TSeedsInterface;
-    typedef fpa::Image::Algorithm< TInputImage, TLabelImage, TMarksInterface, TSeedsInterface > TAlgorithm;
+    typedef fpa::Filters::BaseMarksInterface< TInternalTraits >  TMarksInterface;
+    typedef fpa::Filters::Image::SeedsFromLabelsInterface< TInternalTraits > TSeedsInterface;
+  };
 
-    typedef MoriLabelling                       Self;
-    typedef fpa::Base::RegionGrow< TAlgorithm > Superclass;
-    typedef itk::SmartPointer< Self >           Pointer;
-    typedef itk::SmartPointer< const Self >     ConstPointer;
+  /**
+   */
+  template< class _TImage, class _TLabels, class _TScalarImage >
+  class MoriLabelling
+    : public fpa::Filters::Image::RegionGrow< _TImage, _TLabels, typename _TLabels::PixelType, CTBronchi::MoriLabellingTraits< _TImage, _TLabels > >
+  {
+  public:
+    typedef CTBronchi::MoriLabellingTraits< _TImage, _TLabels > TTraits;
+    fpaTraitsMacro( typename TTraits );
 
-    typedef typename TSeedsInterface::TNode  TNode;
-    typedef typename TSeedsInterface::TNodes TNodes;
+    typedef fpa::Filters::Image::RegionGrow< _TImage, _TLabels, TMark, TTraits > Superclass;
+    typedef MoriLabelling Self;
+    typedef itk::SmartPointer< Self > Pointer;
+    typedef itk::SmartPointer< const Self > ConstPointer;
 
-    typedef fpa::Base::Functors::RegionGrow::BinaryThreshold< TInputValue > TThresholdFunction;
+    typedef fpa::Functors::RegionGrow::BinaryThreshold< TInputValue > TFunctor;
 
   public:
     itkNewMacro( Self );
-    itkTypeMacro( MoriLabelling, fpa::Base::RegionGrow );
-
-    itkGetConstMacro( InsideLabel, TOutputValue );
-    itkSetMacro( InsideLabel, TOutputValue );
-
-  public:
-    const TLabelImage* GetInputLabelImage( ) const;
-    void SetInputLabelImage( TLabelImage* image );
+    itkTypeMacro( MoriLabelling, fpa::Filters::Image::RegionGrow );
 
-    const TInputImage* GetInputRawImage( ) const;
-    void SetInputRawImage( TInputImage* image );
+    itkGetConstMacro( VesselnessThreshold, double );
+    itkSetMacro( VesselnessThreshold, double );
 
-    TInputValue GetUpperThreshold( ) const;
-    void SetUpperThreshold( TInputValue t );
+    itkGetConstMacro( UpperThreshold, TInputValue );
+    itkSetMacro( UpperThreshold, TInputValue );
 
-    TOutputValue GetOutsideValue( ) const;
-    void SetOutsideLabel( TOutputValue o );
+    ivqITKInputMacro( InputLabels, _TLabels );
+    ivqITKInputMacro( InputVesselness, _TScalarImage );
 
   protected:
-    MoriLabelling( );
-    virtual ~MoriLabelling( );
-
-    virtual TNodes _UnifySeeds( ) override;
-    virtual void _UpdateOutputValue( TNode& n ) override;
+    MoriLabelling( )
+      : Superclass( ),
+        m_VesselnessThreshold( 5 ),
+        m_UpperThreshold( -650 )
+      {
+        ivqITKInputConfigureMacro( InputLabels, _TLabels );
+        ivqITKInputConfigureMacro( InputVesselness, _TScalarImage );
+        this->m_Functor = TFunctor::New( );
+        this->SetPredicate( this->m_Functor );
+      }
+
+    virtual ~MoriLabelling( )
+      {
+      }
+
+    virtual const itk::DataObject* _GetReferenceInput( ) const override
+      {
+        return( this->GetInputLabels( ) );
+      }
+    virtual void _BeforeGenerateData( ) override
+      {
+        this->Superclass::_BeforeGenerateData( );
+
+        this->m_Functor->SetUpperThreshold( this->m_UpperThreshold );
+
+        typedef itk::MinimumMaximumImageCalculator< _TScalarImage > _TMinMax;
+        typename _TMinMax::Pointer minMax = _TMinMax::New( );
+        minMax->SetImage( this->GetInputVesselness( ) );
+        minMax->Compute( );
+        this->m_MinVesselness =
+          ( 1.0  - ( this->m_VesselnessThreshold / double( 100 ) ) ) *
+          double( minMax->GetMaximum( ) );
+      }
+
+    virtual void _PostComputeOutputValue( TNode& n ) override
+      {
+        this->Superclass::_PostComputeOutputValue( n );
+        if( n.Value == this->GetInsideValue( ) )
+        {
+          const _TLabels* labels = this->GetInputLabels( );
+          const _TScalarImage* vesselness = this->GetInputVesselness( );
+          if( labels->GetPixel( n.Vertex ) == 0 )
+          {
+            if( this->m_MinVesselness < vesselness->GetPixel( n.Vertex ) )
+              n.Value = this->GetInsideValue( );
+            else
+              n.Value = 0;
+
+          } // fi
+
+        } // fi
+      }
 
   private:
     // Purposely not implemented.
@@ -76,15 +120,14 @@ namespace CTBronchi
     Self& operator=( const Self& other );
 
   protected:
-    TOutputValue m_InsideLabel;
+    typename TFunctor::Pointer m_Functor;
+    double m_VesselnessThreshold;
+    double m_MinVesselness;
+    TInputValue m_UpperThreshold;
   };
 
 } // ecapseman
 
-#ifndef ITK_MANUAL_INSTANTIATION
-#  include <CTBronchi/MoriLabelling.hxx>
-#endif // ITK_MANUAL_INSTANTIATION
-
-#endif // __CTBronchi__MoriLabelling__h__
+#endif // __CTBronchi__Functions__h__
 
 // eof - $RCSfile$