]> Creatis software - FrontAlgorithms.git/blobdiff - appli/CTBronchi/MoriLabelling.h
...
[FrontAlgorithms.git] / appli / CTBronchi / MoriLabelling.h
index 89ce00164a57e417c5938f09e13e727895aa1d0c..ff6553e8419ce05ec3fe151c46721daece56467f 100644 (file)
@@ -5,6 +5,7 @@
 #ifndef __CTBronchi__MoriLabelling__h__
 #define __CTBronchi__MoriLabelling__h__
 
+#include <itkMinimumMaximumImageCalculator.h>
 #include <fpa/Filters/BaseMarksInterface.h>
 #include <fpa/Filters/Image/SeedsFromLabelsInterface.h>
 #include <fpa/Filters/Image/DefaultTraits.h>
@@ -75,6 +76,44 @@ namespace CTBronchi
       {
       }
 
+    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( 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.
     MoriLabelling( const Self& other );
@@ -83,6 +122,7 @@ namespace CTBronchi
   protected:
     typename TFunctor::Pointer m_Functor;
     double m_VesselnessThreshold;
+    double m_MinVesselness;
     TInputValue m_UpperThreshold;
   };