00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkLevelSetFunction_h_
00018 #define __itkLevelSetFunction_h_
00019
00020 #include "itkFiniteDifferenceFunction.h"
00021 #include "vnl/vnl_matrix_fixed.h"
00022
00023 namespace itk {
00024
00063 template <class TImageType>
00064 class ITK_EXPORT LevelSetFunction
00065 : public FiniteDifferenceFunction<TImageType>
00066 {
00067 public:
00069 typedef LevelSetFunction Self;
00070 typedef FiniteDifferenceFunction<TImageType> Superclass;
00071 typedef SmartPointer<Self> Pointer;
00072 typedef SmartPointer<const Self> ConstPointer;
00073
00075 itkNewMacro(Self);
00076
00078 itkTypeMacro( LevelSetFunction, FiniteDifferenceFunction );
00079
00081 itkStaticConstMacro(ImageDimension, unsigned int,Superclass::ImageDimension);
00082
00084 typedef double TimeStepType;
00085 typedef typename Superclass::ImageType ImageType;
00086 typedef typename Superclass::PixelType PixelType;
00087 typedef PixelType ScalarValueType;
00088 typedef typename Superclass::RadiusType RadiusType;
00089 typedef typename Superclass::NeighborhoodType NeighborhoodType;
00090 typedef typename Superclass::FloatOffsetType FloatOffsetType;
00091
00093
00094 typedef FixedArray<ScalarValueType, itkGetStaticConstMacro(ImageDimension)> VectorType;
00095
00101 struct GlobalDataStruct
00102 {
00103 ScalarValueType m_MaxAdvectionChange;
00104 ScalarValueType m_MaxPropagationChange;
00105 ScalarValueType m_MaxCurvatureChange;
00106
00108 vnl_matrix_fixed<ScalarValueType,
00109 itkGetStaticConstMacro(ImageDimension),
00110 itkGetStaticConstMacro(ImageDimension)> m_dxy;
00111
00113 ScalarValueType m_dx[itkGetStaticConstMacro(ImageDimension)];
00114
00115 ScalarValueType m_dx_forward[itkGetStaticConstMacro(ImageDimension)];
00116 ScalarValueType m_dx_backward[itkGetStaticConstMacro(ImageDimension)];
00117
00118 ScalarValueType m_GradMagSqr;
00119 };
00120
00122 virtual VectorType AdvectionField(const NeighborhoodType &,
00123 const FloatOffsetType &, GlobalDataStruct * = 0) const
00124 { return m_ZeroVectorConstant; }
00125
00128 virtual ScalarValueType PropagationSpeed(
00129 const NeighborhoodType& ,
00130 const FloatOffsetType &, GlobalDataStruct * = 0 ) const
00131 { return NumericTraits<ScalarValueType>::Zero; }
00132
00135 virtual ScalarValueType CurvatureSpeed(const NeighborhoodType &,
00136 const FloatOffsetType &, GlobalDataStruct * = 0
00137 ) const
00138 { return NumericTraits<ScalarValueType>::One; }
00139
00142 virtual ScalarValueType LaplacianSmoothingSpeed(
00143 const NeighborhoodType &,
00144 const FloatOffsetType &, GlobalDataStruct * = 0) const
00145 { return NumericTraits<ScalarValueType>::One; }
00146
00148 virtual void SetAdvectionWeight(const ScalarValueType a)
00149 { m_AdvectionWeight = a; }
00150 ScalarValueType GetAdvectionWeight() const
00151 { return m_AdvectionWeight; }
00152
00154 virtual void SetPropagationWeight(const ScalarValueType p)
00155 { m_PropagationWeight = p; }
00156 ScalarValueType GetPropagationWeight() const
00157 { return m_PropagationWeight; }
00158
00160 virtual void SetCurvatureWeight(const ScalarValueType c)
00161 { m_CurvatureWeight = c; }
00162 ScalarValueType GetCurvatureWeight() const
00163 { return m_CurvatureWeight; }
00164
00166 void SetLaplacianSmoothingWeight(const ScalarValueType c)
00167 { m_LaplacianSmoothingWeight = c; }
00168 ScalarValueType GetLaplacianSmoothingWeight() const
00169 { return m_LaplacianSmoothingWeight; }
00170
00172 void SetEpsilonMagnitude(const ScalarValueType e)
00173 { m_EpsilonMagnitude = e; }
00174 ScalarValueType GetEpsilonMagnitude() const
00175 { return m_EpsilonMagnitude; }
00176
00178 virtual PixelType ComputeUpdate(const NeighborhoodType &neighborhood,
00179 void *globalData,
00180 const FloatOffsetType& = FloatOffsetType(0.0));
00181
00188 virtual TimeStepType ComputeGlobalTimeStep(void *GlobalData) const;
00189
00197 virtual void *GetGlobalDataPointer() const
00198 {
00199 GlobalDataStruct *ans = new GlobalDataStruct();
00200 ans->m_MaxAdvectionChange = NumericTraits<ScalarValueType>::Zero;
00201 ans->m_MaxPropagationChange = NumericTraits<ScalarValueType>::Zero;
00202 ans->m_MaxCurvatureChange = NumericTraits<ScalarValueType>::Zero;
00203 return ans;
00204 }
00205
00209 virtual void Initialize(const RadiusType &r);
00210
00215 virtual void ReleaseGlobalDataPointer(void *GlobalData) const
00216 { delete (GlobalDataStruct *) GlobalData; }
00217
00219 virtual ScalarValueType ComputeCurvatureTerm(const NeighborhoodType &,
00220 const FloatOffsetType &,
00221 GlobalDataStruct *gd = 0
00222 );
00223 virtual ScalarValueType ComputeMeanCurvature(const NeighborhoodType &,
00224 const FloatOffsetType &,
00225 GlobalDataStruct *gd = 0
00226 );
00227
00228 virtual ScalarValueType ComputeMinimalCurvature(const NeighborhoodType &,
00229 const FloatOffsetType &,
00230 GlobalDataStruct *gd = 0
00231 );
00232
00233 virtual ScalarValueType Compute3DMinimalCurvature(const NeighborhoodType &,
00234 const FloatOffsetType &,
00235 GlobalDataStruct *gd = 0
00236 );
00237
00239 void SetUseMinimalCurvature( bool b )
00240 {
00241 m_UseMinimalCurvature = b;
00242 }
00243 bool GetUseMinimalCurvature() const
00244 {
00245 return m_UseMinimalCurvature;
00246 }
00247 void UseMinimalCurvatureOn()
00248 {
00249 this->SetUseMinimalCurvature(true);
00250 }
00251 void UseMinimalCurvatureOff()
00252 {
00253 this->SetUseMinimalCurvature(false);
00254 }
00255
00260 static void SetMaximumCurvatureTimeStep(double n)
00261 {
00262 m_DT = n;
00263 }
00264 static double GetMaximumCurvatureTimeStep()
00265 {
00266 return m_DT;
00267 }
00268
00273 static void SetMaximumPropagationTimeStep(double n)
00274 {
00275 m_WaveDT = n;
00276 }
00277 static double GetMaximumPropagationTimeStep()
00278 {
00279 return m_WaveDT;
00280 }
00281
00282 protected:
00283 LevelSetFunction()
00284 {
00285 m_EpsilonMagnitude = 1.0e-5;
00286 m_AdvectionWeight = m_PropagationWeight
00287 = m_CurvatureWeight = m_LaplacianSmoothingWeight
00288 = NumericTraits<ScalarValueType>::Zero;
00289 m_UseMinimalCurvature = false;
00290 }
00291 virtual ~LevelSetFunction() {}
00292 void PrintSelf(std::ostream &s, Indent indent) const;
00293
00295 static double m_WaveDT;
00296 static double m_DT;
00297
00299 std::slice x_slice[itkGetStaticConstMacro(ImageDimension)];
00300
00302 ::size_t m_Center;
00303
00305 ::size_t m_xStride[itkGetStaticConstMacro(ImageDimension)];
00306
00307 bool m_UseMinimalCurvature;
00308
00311 static VectorType InitializeZeroVectorConstant();
00312
00314 static VectorType m_ZeroVectorConstant;
00315
00317 ScalarValueType m_EpsilonMagnitude;
00318
00320 ScalarValueType m_AdvectionWeight;
00321
00323 ScalarValueType m_PropagationWeight;
00324
00326 ScalarValueType m_CurvatureWeight;
00327
00329 ScalarValueType m_LaplacianSmoothingWeight;
00330
00331 private:
00332 LevelSetFunction(const Self&);
00333 void operator=(const Self&);
00334 };
00335
00336 }
00337
00338 #ifndef ITK_MANUAL_INSTANTIATION
00339 #include "itkLevelSetFunction.txx"
00340 #endif
00341
00342 #endif
00343