00001 /*========================================================================= 00002 00003 Program: Insight Segmentation & Registration Toolkit 00004 Module: $RCSfile: itkNormalVectorDiffusionFunction.h,v $ 00005 Language: C++ 00006 Date: $Date: 2008-10-16 19:33:45 $ 00007 Version: $Revision: 1.7 $ 00008 00009 Copyright (c) Insight Software Consortium. All rights reserved. 00010 See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 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 // we add a minimum conductance to avoid divide by zero 00109 // can make this a parameter. 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 protected: 00135 NormalVectorDiffusionFunction(); 00136 ~NormalVectorDiffusionFunction() {} 00137 void PrintSelf(std::ostream& os, Indent indent) const; 00138 00141 NodeValueType FluxStopFunction( const NodeValueType v ) const 00142 { 00143 // the slow ::exp function could be replaced with a lookup table 00144 if (v<=0.0) return NumericTraits<NodeValueType>::One; 00145 else return static_cast<NodeValueType>(::exp(m_FluxStopConstant*v)); 00146 } 00148 00149 private: 00151 NodeValueType m_ConductanceParameter; 00152 00155 NodeValueType m_FluxStopConstant; 00156 00158 int m_NormalProcessType; 00159 00160 NormalVectorDiffusionFunction(const Self&); //purposely not implemented 00161 void operator=(const Self&); //purposely not implemented 00162 }; 00163 00164 } // end namespace itk 00165 00166 #ifndef ITK_MANUAL_INSTANTIATION 00167 #include "itkNormalVectorDiffusionFunction.txx" 00168 #endif 00169 00170 #endif 00171