]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/OtsuThresholdImageFilter.cxx
...
[cpPlugins.git] / lib / cpPlugins / Plugins / OtsuThresholdImageFilter.cxx
1 #include <cpPlugins/Plugins/OtsuThresholdImageFilter.h>
2 #include <cpPlugins/Interface/Image.h>
3
4 #include <complex>
5
6 #define ITK_MANUAL_INSTANTIATION
7 #include <itkImage.h>
8
9 #include <itkCovariantVector.h>
10 #include <itkDiffusionTensor3D.h>
11 #include <itkPoint.h>
12 #include <itkRGBPixel.h>
13 #include <itkRGBAPixel.h>
14 #include <itkSymmetricSecondRankTensor.h>
15 #include <itkVector.h>
16
17 #undef ITK_MANUAL_INSTANTIATION
18 #include <itkOtsuThresholdImageFilter.h>
19
20 // -------------------------------------------------------------------------
21 cpPlugins::Plugins::OtsuThresholdImageFilter::
22 OtsuThresholdImageFilter( )
23   : Superclass( )
24 {
25   this->m_ClassName = "cpPlugins::OtsuThresholdImageFilter";
26   this->m_ClassCategory = "ImageToImageFilter";
27   this->SetNumberOfInputs( 1 );
28   this->SetNumberOfOutputs( 1 );
29   this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
30
31   using namespace cpPlugins::Interface;
32   this->m_DefaultParameters.Configure( Parameters::Uint, "NumberOfHistogramBins" );
33   this->m_DefaultParameters.Configure( Parameters::Real, "InsideValue" );
34   this->m_DefaultParameters.Configure( Parameters::Real, "OutsideValue" );
35   this->m_Parameters = this->m_DefaultParameters;
36 }
37
38 // -------------------------------------------------------------------------
39 cpPlugins::Plugins::OtsuThresholdImageFilter::
40 ~OtsuThresholdImageFilter( )
41 {
42 }
43
44 // -------------------------------------------------------------------------
45 std::string cpPlugins::Plugins::OtsuThresholdImageFilter::
46 _GenerateData( )
47 {
48   itk::DataObject* i = this->m_Inputs[ 0 ]->GetITKDataObject( );
49   return( this->_DemangleImageDimension( i ) );
50 }
51
52 // -------------------------------------------------------------------------
53 namespace cpPlugins
54 {
55   namespace Plugins
56   {
57     cpPlugins_Image_Demangle_Methods_Code_Only_Scalars(
58       OtsuThresholdImageFilter, _DemangleInput
59       );
60   }
61 }
62
63 // -------------------------------------------------------------------------
64 template< class I >
65 std::string cpPlugins::Plugins::OtsuThresholdImageFilter::
66 _DemangleInput( itk::DataObject* image )
67 {
68   if( this->m_Parameters.HasStringValue( "OutputType" ) )
69   {
70     std::string output_type = this->m_Parameters.GetValueAsString( "OutputType" );
71     std::string r = "";
72     if( output_type == "char" )
73       r = this->_RealGD< I, itk::Image< char, I::ImageDimension > >( image );
74     else if( output_type == "uchar" )
75       r = this->_RealGD< I, itk::Image< unsigned char, I::ImageDimension > >( image );
76     else if( output_type == "short" )
77       r = this->_RealGD< I, itk::Image< short, I::ImageDimension > >( image );
78     else if( output_type == "ushort" )
79       r = this->_RealGD< I, itk::Image< unsigned short, I::ImageDimension > >( image );
80     else if( output_type == "int" )
81       r = this->_RealGD< I, itk::Image< int, I::ImageDimension > >( image );
82     else if( output_type == "uint" )
83       r = this->_RealGD< I, itk::Image< unsigned int, I::ImageDimension > >( image );
84     else if( output_type == "long" )
85       r = this->_RealGD< I, itk::Image< long, I::ImageDimension > >( image );
86     else if( output_type == "ulong" )
87       r = this->_RealGD< I, itk::Image< unsigned long, I::ImageDimension > >( image );
88     else if( output_type == "float" )
89       r = this->_RealGD< I, itk::Image< float, I::ImageDimension > >( image );
90     else if( output_type == "double" )
91       r = this->_RealGD< I, itk::Image< double, I::ImageDimension > >( image );
92     else
93       r = "OtsuThresholdImageFilter: Invalid output type.";
94   }
95   else
96     return( this->_RealGD< I, I >( image ) );
97 }
98
99 // -------------------------------------------------------------------------
100 template< class I, class O >
101 std::string cpPlugins::Plugins::OtsuThresholdImageFilter::
102 _RealGD( itk::DataObject* image )
103 {
104   typedef itk::OtsuThresholdImageFilter< I, O > _F;
105   typedef typename O::PixelType _OP;
106
107   unsigned int bins = this->m_Parameters.GetValueAsUint( "NumberOfHistogramBins" );
108   _OP in = _OP( this->m_Parameters.GetValueAsReal( "InsideValue" ) );
109   _OP out = _OP( this->m_Parameters.GetValueAsReal( "OutsideValue" ) );
110
111   _F* filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
112   if( filter == NULL )
113   {
114     this->m_RealProcessObject = _F::New( );
115     filter = dynamic_cast< _F* >( this->m_RealProcessObject.GetPointer( ) );
116
117   } // fi
118   filter->SetInput( dynamic_cast< I* >( image ) );
119   filter->SetNumberOfHistogramBins( bins );
120   filter->SetInsideValue( in );
121   filter->SetOutsideValue( out );
122   filter->Update( );
123   this->m_Outputs[ 0 ]->SetITKDataObject( filter->GetOutput( ) );
124   
125   return( "" );
126 }
127
128 // eof - $RCSfile$