1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: itkExpNegativeImageFilter.h
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __itkExpNegativeImageFilter_h
#define __itkExpNegativeImageFilter_h
#include "itkUnaryFunctorImageFilter.h"
#include "vnl/vnl_math.h"
namespace itk
{
/** \class ExpNegativeImageFilter
* \brief Computes the function vcl_exp(-K.x) pixel-wise
*
* Every output pixel is equal to vcl_exp(-K.x ). where x is the intensity of the
* homologous input pixel, and K is a user-provided constant.
*
* \ingroup IntensityImageFilters Multithreaded
*
*/
namespace Function {
template< class TInput, class TOutput>
class ExpNegative
{
public:
ExpNegative() { m_Factor = 1.0; }
~ExpNegative() {};
bool operator!=( const ExpNegative & other ) const
{
if( m_Factor != other.m_Factor )
{
return true;
}
return false;
}
bool operator==( const ExpNegative & other ) const
{
return !(*this != other);
}
inline TOutput operator()( const TInput & A ) const
{
return static_cast<TOutput>( vcl_exp(- m_Factor * static_cast<double>(A) ) );
}
void SetFactor( double factor )
{
m_Factor = factor;
}
double GetFactor() const
{
return m_Factor;
}
private:
double m_Factor;
};
}
template <class TInputImage, class TOutputImage>
class ITK_EXPORT ExpNegativeImageFilter :
public
UnaryFunctorImageFilter<TInputImage,TOutputImage,
Function::ExpNegative<
typename TInputImage::PixelType,
typename TOutputImage::PixelType> >
{
public:
/** Standard class typedefs. */
typedef ExpNegativeImageFilter Self;
typedef UnaryFunctorImageFilter<
TInputImage,TOutputImage,
Function::ExpNegative< typename TInputImage::PixelType,
typename TOutputImage::PixelType> > Superclass;
typedef SmartPointer<Self> Pointer;
typedef SmartPointer<const Self> ConstPointer;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Runtime information support. */
itkTypeMacro(ExpNegativeImageFilter,
UnaryFunctorImageFilter);
void SetFactor( double factor )
{
if( factor == this->GetFunctor().GetFactor() )
{
return;
}
this->GetFunctor().SetFactor( factor );
this->Modified();
}
#ifdef ITK_USE_CONCEPT_CHECKING
/** Begin concept checking */
itkConceptMacro(InputConvertibleToDoubleCheck,
(Concept::Convertible<typename TInputImage::PixelType, double>));
itkConceptMacro(DoubleConvertibleToOutputCheck,
(Concept::Convertible<double, typename TOutputImage::PixelType>));
/** End concept checking */
#endif
protected:
ExpNegativeImageFilter() {}
virtual ~ExpNegativeImageFilter() {}
private:
ExpNegativeImageFilter(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented
};
} // end namespace itk
#endif
|