]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx
...
[cpPlugins.git] / lib / cpPlugins / Plugins / OtsuThresholdImageFilter.cxx
diff --git a/lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx b/lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx
new file mode 100644 (file)
index 0000000..38228b9
--- /dev/null
@@ -0,0 +1,128 @@
+#include <cpPlugins/Plugins/OtsuThresholdImageFilter.h>
+#include <cpPlugins/Interface/Image.h>
+
+#include <complex>
+
+#define ITK_MANUAL_INSTANTIATION
+#include <itkImage.h>
+
+#include <itkCovariantVector.h>
+#include <itkDiffusionTensor3D.h>
+#include <itkPoint.h>
+#include <itkRGBPixel.h>
+#include <itkRGBAPixel.h>
+#include <itkSymmetricSecondRankTensor.h>
+#include <itkVector.h>
+
+#undef ITK_MANUAL_INSTANTIATION
+#include <itkOtsuThresholdImageFilter.h>
+
+// -------------------------------------------------------------------------
+cpPlugins::Plugins::OtsuThresholdImageFilter::
+OtsuThresholdImageFilter( )
+  : Superclass( )
+{
+  this->m_ClassName = "cpPlugins::OtsuThresholdImageFilter";
+  this->m_ClassCategory = "ImageToImageFilter";
+  this->SetNumberOfInputs( 1 );
+  this->SetNumberOfOutputs( 1 );
+  this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
+
+  using namespace cpPlugins::Interface;
+  this->m_DefaultParameters.Configure( Parameters::Uint, "NumberOfHistogramBins" );
+  this->m_DefaultParameters.Configure( Parameters::Real, "InsideValue" );
+  this->m_DefaultParameters.Configure( Parameters::Real, "OutsideValue" );
+  this->m_Parameters = this->m_DefaultParameters;
+}
+
+// -------------------------------------------------------------------------
+cpPlugins::Plugins::OtsuThresholdImageFilter::
+~OtsuThresholdImageFilter( )
+{
+}
+
+// -------------------------------------------------------------------------
+std::string cpPlugins::Plugins::OtsuThresholdImageFilter::
+_GenerateData( )
+{
+  itk::DataObject* i = this->m_Inputs[ 0 ]->GetITKDataObject( );
+  return( this->_DemangleImageDimension( i ) );
+}
+
+// -------------------------------------------------------------------------
+namespace cpPlugins
+{
+  namespace Plugins
+  {
+    cpPlugins_Image_Demangle_Methods_Code_Only_Scalars(
+      OtsuThresholdImageFilter, _DemangleInput
+      );
+  }
+}
+
+// -------------------------------------------------------------------------
+template< class I >
+std::string cpPlugins::Plugins::OtsuThresholdImageFilter::
+_DemangleInput( itk::DataObject* image )
+{
+  if( this->m_Parameters.HasStringValue( "OutputType" ) )
+  {
+    std::string output_type = this->m_Parameters.GetValueAsString( "OutputType" );
+    std::string r = "";
+    if( output_type == "char" )
+      r = this->_RealGD< I, itk::Image< char, I::ImageDimension > >( image );
+    else if( output_type == "uchar" )
+      r = this->_RealGD< I, itk::Image< unsigned char, I::ImageDimension > >( image );
+    else if( output_type == "short" )
+      r = this->_RealGD< I, itk::Image< short, I::ImageDimension > >( image );
+    else if( output_type == "ushort" )
+      r = this->_RealGD< I, itk::Image< unsigned short, I::ImageDimension > >( image );
+    else if( output_type == "int" )
+      r = this->_RealGD< I, itk::Image< int, I::ImageDimension > >( image );
+    else if( output_type == "uint" )
+      r = this->_RealGD< I, itk::Image< unsigned int, I::ImageDimension > >( image );
+    else if( output_type == "long" )
+      r = this->_RealGD< I, itk::Image< long, I::ImageDimension > >( image );
+    else if( output_type == "ulong" )
+      r = this->_RealGD< I, itk::Image< unsigned long, I::ImageDimension > >( image );
+    else if( output_type == "float" )
+      r = this->_RealGD< I, itk::Image< float, I::ImageDimension > >( image );
+    else if( output_type == "double" )
+      r = this->_RealGD< I, itk::Image< double, I::ImageDimension > >( image );
+    else
+      r = "OtsuThresholdImageFilter: Invalid output type.";
+  }
+  else
+    return( this->_RealGD< I, I >( image ) );
+}
+
+// -------------------------------------------------------------------------
+template< class I, class O >
+std::string cpPlugins::Plugins::OtsuThresholdImageFilter::
+_RealGD( itk::DataObject* image )
+{
+  typedef itk::OtsuThresholdImageFilter< I, O > _F;
+  typedef typename O::PixelType _OP;
+
+  unsigned int bins = this->m_Parameters.GetValueAsUint( "NumberOfHistogramBins" );
+  _OP in = _OP( this->m_Parameters.GetValueAsReal( "InsideValue" ) );
+  _OP out = _OP( this->m_Parameters.GetValueAsReal( "OutsideValue" ) );
+
+  _F* filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
+  if( filter == NULL )
+  {
+    this->m_RealProcessObject = _F::New( );
+    filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
+
+  } // fi
+  filter->SetInput( dynamic_cast< I* >( image ) );
+  filter->SetNumberOfHistogramBins( bins );
+  filter->SetInsideValue( in );
+  filter->SetOutsideValue( out );
+  filter->Update( );
+  this->m_Outputs[ 0 ]->SetITKDataObject( filter->GetOutput( ) );
+  
+  return( "" );
+}
+
+// eof - $RCSfile$