]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Plugins/BasicFilters/FloodFillImageFilter.cxx
More on graph editor
[cpPlugins.git] / lib / cpPlugins / Plugins / BasicFilters / FloodFillImageFilter.cxx
index 471c10bdb07deb2d961afbc725d4e7cc4a1ade64..376602bfe6d9f4708f70a0fd5115b6beeb3de488 100644 (file)
@@ -9,18 +9,19 @@ cpPlugins::BasicFilters::FloodFillImageFilter::
 FloodFillImageFilter( )
   : Superclass( )
 {
-  this->SetNumberOfInputs( 1 );
-  this->SetNumberOfOutputs( 1 );
-  this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
-
-  using namespace cpPlugins::Interface;
-  this->m_DefaultParameters.Configure( Parameters::Point, "Seed" );
-  this->m_DefaultParameters.Configure( Parameters::Real, "InsideValue" );
-  this->m_DefaultParameters.Configure( Parameters::Real, "OutsideValue" );
-  this->m_DefaultParameters.SetValueAsPoint( "Seed", 3, 0, 0, 0 );
-  this->m_DefaultParameters.SetValueAsReal( "InsideValue", 255 );
-  this->m_DefaultParameters.SetValueAsReal( "OutsideValue", 0 );
-  this->m_Parameters = this->m_DefaultParameters;
+  this->_AddInput( "Input" );
+  this->_MakeOutput< cpPlugins::Interface::Image >( "Output" );
+
+  this->m_Parameters->ConfigureAsPoint( "Seed" );
+  this->m_Parameters->ConfigureAsReal( "Window" );
+  this->m_Parameters->ConfigureAsReal( "Level" );
+  this->m_Parameters->ConfigureAsUint( "InsideValue" );
+  this->m_Parameters->ConfigureAsUint( "OutsideValue" );
+
+  this->m_Parameters->SetReal( "Window", 0 );
+  this->m_Parameters->SetReal( "Level", 0 );
+  this->m_Parameters->SetUint( "InsideValue", 0 );
+  this->m_Parameters->SetUint( "OutsideValue", 255 );
 }
 
 // -------------------------------------------------------------------------
@@ -34,7 +35,7 @@ std::string cpPlugins::BasicFilters::FloodFillImageFilter::
 _GenerateData( )
 {
   cpPlugins::Interface::Image* image =
-    this->GetInput< cpPlugins::Interface::Image >( 0 );
+    this->GetInput< cpPlugins::Interface::Image >( "Input" );
   if( image == NULL )
     return( "FloodFillImageFilter: No input image." );
 
@@ -80,6 +81,9 @@ public:
     itkImageFunction
     );
 
+  itkSetMacro( Window, double );
+  itkSetMacro( Level, double );
+
 public:
   virtual bool Evaluate( const TPoint& point ) const
     {
@@ -87,7 +91,29 @@ public:
     }
   virtual bool EvaluateAtIndex( const TIndex& index ) const
     {
-      return( true );
+      if( !( this->IsInsideBuffer( index ) ) )
+        return( false );
+
+      const I* image = this->GetInputImage( );
+      double w2 = this->m_Window / double( 2 );
+      double min = this->m_Level - w2;
+      double max = this->m_Level + w2;
+      unsigned char val = double( 0 );
+      double x = double( image->GetPixel( index ) );
+      double m = double( 100 ) / this->m_Window;
+      double b = ( this->m_Window - ( double( 2 ) * this->m_Level ) );
+      b *= double( 50 ) / this->m_Window;
+      if( x > min && x < max )
+        val = ( unsigned char )( ( m * x ) + b );
+
+      if( this->m_Start )
+      {
+        this->m_StartValue = val;
+        this->m_Start = false;
+        return( true );
+      }
+      else
+        return( std::abs( this->m_StartValue - val ) <= 2 );
     }
   virtual bool EvaluateAtContinuousIndex( const TCIndex& index ) const
     {
@@ -96,7 +122,10 @@ public:
 
 protected:
   cpPlugins_BasicFilters_FloodFillImageFilter_Function( )
-    : Superclass( )
+    : Superclass( ),
+      m_Window( double( 0 ) ),
+      m_Level( double( 0 ) ),
+      m_Start( true )
     {
     }
   virtual ~cpPlugins_BasicFilters_FloodFillImageFilter_Function( )
@@ -107,6 +136,12 @@ private:
   // Purposely not implemented
   cpPlugins_BasicFilters_FloodFillImageFilter_Function( const Self& other );
   Self& operator=( const Self& other );
+
+protected:
+  double m_Window;
+  double m_Level;
+  mutable unsigned char m_StartValue;
+  mutable bool m_Start;
 };
 
 // -------------------------------------------------------------------------
@@ -119,9 +154,13 @@ _RealGD( itk::DataObject* image )
   typedef itk::FloodFilledImageFunctionConditionalConstIterator< I, _F > _It;
 
   typename I::PointType pseed;
-  pseed = this->m_Parameters.GetValueAsPoint< typename I::PointType >( "Seed" );
-  _OP in_val = _OP( this->m_Parameters.GetValueAsReal( "InsideValue" ) );
-  _OP out_val = _OP( this->m_Parameters.GetValueAsReal( "OutsideValue" ) );
+  pseed = this->m_Parameters->GetPoint< typename I::PointType >(
+    "Seed", I::ImageDimension
+    );
+  double window = this->m_Parameters->GetReal( "Window" );
+  double level = this->m_Parameters->GetReal( "Level" );
+  _OP in_val = _OP( this->m_Parameters->GetUint( "InsideValue" ) );
+  _OP out_val = _OP( this->m_Parameters->GetUint( "OutsideValue" ) );
 
   const I* in = dynamic_cast< const I* >( image );
   typename I::IndexType seed;
@@ -138,6 +177,9 @@ _RealGD( itk::DataObject* image )
   out->FillBuffer( out_val );
 
   typename _F::Pointer f = _F::New( );
+  f->SetInputImage( in );
+  f->SetWindow( window );
+  f->SetLevel( level );
   _It i( in, f );
   i.AddSeed( seed );
 
@@ -146,7 +188,7 @@ _RealGD( itk::DataObject* image )
 
   // Connect output
   cpPlugins::Interface::Image* out_port =
-    this->GetOutput< cpPlugins::Interface::Image >( 0 );
+    this->GetOutput< cpPlugins::Interface::Image >( "Output" );
   if( out_port != NULL )
   {
     out_port->SetITK< O >( out );