00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkSigmoidImageFilter_h
00018 #define __itkSigmoidImageFilter_h
00019
00020 #include "itkUnaryFunctorImageFilter.h"
00021
00022 namespace itk
00023 {
00024
00042 namespace Function {
00043 template< class TInput, class TOutput>
00044 class Sigmoid
00045 {
00046 public:
00047 Sigmoid() {
00048 m_Alpha = 1.0;
00049 m_Beta = 0.0;
00050 m_OutputMinimum = NumericTraits< TOutput >::min();
00051 m_OutputMaximum = NumericTraits< TOutput >::max();
00052 }
00053 ~Sigmoid() {};
00054 inline TOutput operator()( const TInput & A )
00055 {
00056 const double x = ( static_cast<double>(A) - m_Beta ) / m_Alpha;
00057 const double e = 1.0 / ( 1.0 + exp( - x ) );
00058 const double v =
00059 (m_OutputMaximum - m_OutputMinimum ) * e + m_OutputMinimum;
00060 return static_cast<TOutput>( v );
00061 }
00062 void SetAlpha( double alpha ) {
00063 m_Alpha = alpha;
00064 }
00065 void SetBeta( double beta ) {
00066 m_Beta = beta;
00067 }
00068 double GetAlpha() const {
00069 return m_Alpha;
00070 }
00071 double GetBeta() const {
00072 return m_Beta;
00073 }
00074 void SetOutputMinimum( TOutput min ) {
00075 m_OutputMinimum = min;
00076 }
00077 void SetOutputMaximum( TOutput max ) {
00078 m_OutputMaximum = max;
00079 }
00080 TOutput GetOutputMinimum() const {
00081 return m_OutputMinimum;
00082 }
00083 TOutput GetOutputMaximum() const {
00084 return m_OutputMaximum;
00085 }
00086
00087 private:
00088 double m_Alpha;
00089 double m_Beta;
00090 TOutput m_OutputMinimum;
00091 TOutput m_OutputMaximum;
00092 };
00093 }
00094
00095
00096 template <class TInputImage, class TOutputImage>
00097 class ITK_EXPORT SigmoidImageFilter :
00098 public
00099 UnaryFunctorImageFilter<TInputImage,TOutputImage,
00100 Function::Sigmoid<
00101 typename TInputImage::PixelType,
00102 typename TOutputImage::PixelType> >
00103 {
00104 public:
00106 typedef SigmoidImageFilter Self;
00107 typedef UnaryFunctorImageFilter<TInputImage,TOutputImage,
00108 Function::Sigmoid< typename TInputImage::PixelType,
00109 typename TOutputImage::PixelType> > Superclass;
00110 typedef SmartPointer<Self> Pointer;
00111 typedef SmartPointer<const Self> ConstPointer;
00112
00113 typedef typename TOutputImage::PixelType OutputPixelType;
00114
00116 itkNewMacro(Self);
00117
00118 void SetAlpha( double alpha )
00119 {
00120 if( alpha == this->GetFunctor().GetAlpha() )
00121 {
00122 return;
00123 }
00124 this->GetFunctor().SetAlpha( alpha );
00125 this->Modified();
00126 }
00127
00128 void SetBeta( double beta )
00129 {
00130 if( beta == this->GetFunctor().GetBeta() )
00131 {
00132 return;
00133 }
00134 this->GetFunctor().SetBeta( beta );
00135 this->Modified();
00136 }
00137
00138 void SetOutputMinimum( OutputPixelType min )
00139 {
00140 if( min == this->GetFunctor().GetOutputMinimum() )
00141 {
00142 return;
00143 }
00144 this->GetFunctor().SetOutputMinimum( min );
00145 this->Modified();
00146 }
00147
00148 void SetOutputMaximum( OutputPixelType max )
00149 {
00150 if( max == this->GetFunctor().GetOutputMaximum() )
00151 {
00152 return;
00153 }
00154 this->GetFunctor().SetOutputMaximum( max );
00155 this->Modified();
00156 }
00157
00158 protected:
00159 SigmoidImageFilter() {}
00160 virtual ~SigmoidImageFilter() {}
00161
00162 private:
00163 SigmoidImageFilter(const Self&);
00164 void operator=(const Self&);
00165
00166 };
00167
00168 }
00169
00170
00171 #endif