00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkDiscreteGaussianDerivativeImageFunction_h
00019 #define __itkDiscreteGaussianDerivativeImageFunction_h
00020
00021 #include "itkNeighborhoodOperatorImageFunction.h"
00022 #include "itkImageFunction.h"
00023 #include "itkGaussianOperator.h"
00024 #include "itkGaussianDerivativeOperator.h"
00025
00026 namespace itk
00027 {
00028
00048 template <class TInputImage,class TOutput=double>
00049 class ITK_EXPORT DiscreteGaussianDerivativeImageFunction :
00050 public ImageFunction< TInputImage, TOutput, TOutput >
00051 {
00052 public:
00053
00055 typedef DiscreteGaussianDerivativeImageFunction Self;
00056
00058 typedef ImageFunction<TInputImage, TOutput, TOutput> Superclass;
00059
00061 typedef SmartPointer<Self> Pointer;
00062 typedef SmartPointer<const Self> ConstPointer;
00063
00065 itkNewMacro(Self);
00066
00068 itkTypeMacro( DiscreteGaussianDerivativeImageFunction, ImageFunction );
00069
00071 typedef typename Superclass::InputImageType InputImageType;
00072 typedef typename Superclass::InputPixelType InputPixelType;
00073 typedef typename Superclass::IndexType IndexType;
00074 typedef typename Superclass::ContinuousIndexType ContinuousIndexType;
00075 typedef typename Superclass::PointType PointType;
00076
00078 itkStaticConstMacro(ImageDimension2, unsigned int,
00079 InputImageType::ImageDimension);
00080
00082 typedef typename Superclass::OutputType OutputType;
00083
00085 typedef FixedArray<double,itkGetStaticConstMacro(ImageDimension2)> VarianceArrayType;
00086 typedef FixedArray<unsigned int,itkGetStaticConstMacro(ImageDimension2)> OrderArrayType;
00088
00089 typedef itk::GaussianDerivativeOperator<TOutput,
00090 itkGetStaticConstMacro(ImageDimension2)> GaussianDerivativeOperatorType;
00091
00093 typedef FixedArray<GaussianDerivativeOperatorType,
00094 itkGetStaticConstMacro(ImageDimension2)> GaussianDerivativeOperatorArrayType;
00095
00097 typedef Neighborhood<TOutput,itkGetStaticConstMacro(ImageDimension2)> KernelType;
00098
00100 typedef NeighborhoodOperatorImageFunction
00101 <InputImageType, TOutput> OperatorImageFunctionType;
00102 typedef typename OperatorImageFunctionType::Pointer OperatorImageFunctionPointer;
00103
00105 enum InterpolationModeType { NearestNeighbourInterpolation, LinearInterpolation };
00106
00107 public:
00108
00110 virtual OutputType Evaluate(const PointType& point) const;
00111
00113 virtual OutputType EvaluateAtIndex( const IndexType & index ) const;
00114
00116 virtual OutputType EvaluateAtContinuousIndex(
00117 const ContinuousIndexType & index ) const;
00118
00125 itkSetMacro( Variance, VarianceArrayType );
00126 itkGetMacro( Variance, const VarianceArrayType );
00127 itkSetVectorMacro( Variance, double, VarianceArrayType::Length );
00129
00131 virtual void SetVariance( double variance )
00132 {
00133 m_Variance.Fill( variance );
00134 this->Modified();
00135 }
00137
00141 void SetSigma( const double sigma )
00142 {
00143 SetVariance( sigma * sigma );
00144 }
00145
00152 itkSetClampMacro( MaximumError, double, 0.00001, 0.99999 );
00153 itkGetMacro( MaximumError, double );
00155
00157 itkSetMacro( Order, OrderArrayType );
00158 itkGetMacro( Order, const OrderArrayType );
00159 itkSetVectorMacro( Order, unsigned int, OrderArrayType::Length );
00161
00163 virtual void SetOrder( unsigned int order )
00164 {
00165 m_Order.Fill( order );
00166 this->Modified();
00167 }
00169
00172 itkSetMacro( NormalizeAcrossScale, bool );
00173 itkGetMacro( NormalizeAcrossScale, bool );
00174 itkBooleanMacro( NormalizeAcrossScale );
00176
00178 itkSetMacro( UseImageSpacing, bool );
00179 itkGetMacro( UseImageSpacing, bool );
00180 itkBooleanMacro( UseImageSpacing );
00182
00187 itkSetMacro( MaximumKernelWidth, unsigned int );
00188 itkGetMacro( MaximumKernelWidth, unsigned int );
00190
00192 itkSetMacro( InterpolationMode, InterpolationModeType );
00193 itkGetMacro( InterpolationMode, InterpolationModeType );
00195
00200 virtual void SetInputImage( const InputImageType * ptr );
00201
00204 virtual void Initialize( ) { RecomputeGaussianKernel(); }
00205
00206 protected:
00207
00208 DiscreteGaussianDerivativeImageFunction();
00209 DiscreteGaussianDerivativeImageFunction( const Self& ){};
00210
00211 ~DiscreteGaussianDerivativeImageFunction(){};
00212
00213 void operator=( const Self& ){};
00214 void PrintSelf(std::ostream& os, Indent indent) const;
00215
00216 void RecomputeGaussianKernel();
00217
00218
00219
00220 private:
00221
00223 VarianceArrayType m_Variance;
00224
00226 OrderArrayType m_Order;
00227
00230 double m_MaximumError;
00231
00235 unsigned int m_MaximumKernelWidth;
00236
00238 GaussianDerivativeOperatorArrayType m_OperatorArray;
00239
00242 KernelType m_DerivativeKernel;
00243
00245 OperatorImageFunctionPointer m_OperatorImageFunction;
00246
00248 bool m_NormalizeAcrossScale;
00249
00251 bool m_UseImageSpacing;
00252
00254 InterpolationModeType m_InterpolationMode;
00255
00256 };
00257
00258 }
00259
00260
00261 #define ITK_TEMPLATE_DiscreteGaussianDerivativeImageFunction(_, EXPORT, x, y) namespace itk { \
00262 _(2(class EXPORT DiscreteGaussianDerivativeImageFunction< ITK_TEMPLATE_2 x >)) \
00263 namespace Templates { typedef DiscreteGaussianDerivativeImageFunction< ITK_TEMPLATE_2 x > \
00264 DiscreteGaussianDerivativeImageFunction##y; } \
00265 }
00266
00267 #if ITK_TEMPLATE_EXPLICIT
00268 # include "Templates/itkDiscreteGaussianDerivativeImageFunction+-.h"
00269 #endif
00270
00271 #if ITK_TEMPLATE_TXX
00272 # include "itkDiscreteGaussianDerivativeImageFunction.txx"
00273 #endif
00274
00275 #endif
00276