00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkNormalVectorDiffusionFunction_h_
00018 #define __itkNormalVectorDiffusionFunction_h_
00019
00020 #include "itkNormalVectorFunctionBase.h"
00021 #include "itkNumericTraits.h"
00022 #include <math.h>
00023
00024 namespace itk {
00025
00057 template <class TSparseImageType>
00058 class ITK_EXPORT NormalVectorDiffusionFunction
00059 :public NormalVectorFunctionBase <TSparseImageType>
00060 {
00061 public:
00063 typedef NormalVectorDiffusionFunction Self;
00064 typedef NormalVectorFunctionBase <TSparseImageType> Superclass;
00065 typedef SmartPointer<Self> Pointer;
00066 typedef SmartPointer<const Self> ConstPointer;
00067
00069 itkTypeMacro( NormalVectorDiffusionFunction, NormalVectorFunctionBase);
00070
00072 itkStaticConstMacro(ImageDimension, unsigned int, Superclass::ImageDimension);
00073
00075 itkNewMacro(Self);
00076
00078 typedef typename Superclass::TimeStepType TimeStepType;
00079 typedef typename Superclass::RadiusType RadiusType;
00080 typedef typename Superclass::NeighborhoodType NeighborhoodType;
00081 typedef typename Superclass::NeighborhoodScalesType NeighborhoodScalesType;
00082 typedef typename Superclass::FloatOffsetType FloatOffsetType;
00083 typedef typename Superclass::IndexType IndexType;
00084 typedef typename Superclass::SparseImageType SparseImageType;
00085 typedef typename Superclass::NodeType NodeType;
00086 typedef typename Superclass::NodeValueType NodeValueType;
00087 typedef typename Superclass::NormalVectorType NormalVectorType;
00088
00093 void SetNormalProcessType( int npt )
00094 { m_NormalProcessType = npt; }
00095
00097 int GetNormalProcessType() const
00098 { return m_NormalProcessType; }
00099
00105 void SetConductanceParameter( NodeValueType cp )
00106 {
00107 m_ConductanceParameter = cp + static_cast<NodeValueType> (0.001);
00108
00109
00110 m_FluxStopConstant = static_cast<NodeValueType>
00111 (-1.0/(m_ConductanceParameter*m_ConductanceParameter));
00112 }
00114
00116 NodeValueType GetConductanceParameter() const
00117 { return m_ConductanceParameter; }
00118
00120 NodeValueType GetFluxStopConstant() const
00121 { return m_FluxStopConstant; }
00122
00127 virtual void PrecomputeSparseUpdate( NeighborhoodType &it ) const;
00128
00130 virtual NormalVectorType ComputeSparseUpdate (NeighborhoodType &neighborhood,
00131 void *globalData,
00132 const FloatOffsetType &offset) const;
00133
00134 private:
00136 NodeValueType m_ConductanceParameter;
00137
00140 NodeValueType m_FluxStopConstant;
00141
00142 protected:
00143 NormalVectorDiffusionFunction();
00144 ~NormalVectorDiffusionFunction() {}
00145 void PrintSelf(std::ostream& os, Indent indent) const;
00146
00149 NodeValueType FluxStopFunction( const NodeValueType v ) const
00150 {
00151
00152 if (v<=0.0) return NumericTraits<NodeValueType>::One;
00153 else return static_cast<NodeValueType>(::exp(m_FluxStopConstant*v));
00154 }
00156
00157 private:
00159 int m_NormalProcessType;
00160
00161 NormalVectorDiffusionFunction(const Self&);
00162 void operator=(const Self&);
00163 };
00164
00165 }
00166
00167 #ifndef ITK_MANUAL_INSTANTIATION
00168 #include "itkNormalVectorDiffusionFunction.txx"
00169 #endif
00170
00171 #endif
00172