00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkCannySegmentationLevelSetFunction_h_
00018 #define __itkCannySegmentationLevelSetFunction_h_
00019
00020 #include "itkSegmentationLevelSetFunction.h"
00021 #include "itkCastImageFilter.h"
00022 #include "itkCannyEdgeDetectionImageFilter.h"
00023 #include "itkDanielssonDistanceMapImageFilter.h"
00024
00025 namespace itk {
00026
00032 template <class TImageType, class TFeatureImageType = TImageType>
00033 class ITK_EXPORT CannySegmentationLevelSetFunction
00034 : public SegmentationLevelSetFunction<TImageType, TFeatureImageType>
00035 {
00036 public:
00037
00039 typedef CannySegmentationLevelSetFunction Self;
00040 typedef SegmentationLevelSetFunction<TImageType, TFeatureImageType> Superclass;
00041 typedef SmartPointer<Self> Pointer;
00042 typedef SmartPointer<const Self> ConstPointer;
00043 typedef TFeatureImageType FeatureImageType;
00044
00046 itkNewMacro(Self);
00047
00049 itkTypeMacro( CannySegmentationLevelSetFunction, SegmentationLevelSetFunction );
00050
00052 typedef typename Superclass::ImageType ImageType;
00053 typedef typename Superclass::ScalarValueType ScalarValueType;
00054 typedef typename Superclass::VectorImageType VectorImageType;
00055 typedef typename Superclass::FeatureScalarType FeatureScalarType;
00056 typedef typename Superclass::RadiusType RadiusType;
00057
00059 itkStaticConstMacro(ImageDimension, unsigned int,
00060 Superclass::ImageDimension);
00061
00063 void SetThreshold(ScalarValueType v)
00064 { m_Threshold = v; }
00065 ScalarValueType GetThreshold() const
00066 { return m_Threshold; }
00068
00070 void SetVariance(double v)
00071 { m_Variance = v; }
00072 double GetVariance() const
00073 { return m_Variance; }
00075
00078 virtual void CalculateSpeedImage();
00079
00082 virtual void CalculateAdvectionImage();
00083
00086 virtual void CalculateDistanceImage();
00087
00088 virtual void Initialize(const RadiusType &r)
00089 {
00090 Superclass::Initialize(r);
00091
00092 this->SetAdvectionWeight(-1.0 * NumericTraits<ScalarValueType>::One);
00093 this->SetPropagationWeight(-1.0 * NumericTraits<ScalarValueType>::One);
00094 this->SetCurvatureWeight(NumericTraits<ScalarValueType>::One);
00095 }
00096
00097 ImageType *GetCannyImage()
00098 { return m_Canny->GetOutput(); }
00099
00100 protected:
00101 CannySegmentationLevelSetFunction()
00102 {
00103 m_Variance = 0.0;
00104 m_Threshold = NumericTraits<ScalarValueType>::Zero;
00105 m_Caster = CastImageFilter<FeatureImageType,ImageType>::New();
00106 m_Canny = CannyEdgeDetectionImageFilter<ImageType,ImageType>::New();
00107 m_Distance = DanielssonDistanceMapImageFilter<ImageType,ImageType>::New();
00108 }
00109 virtual ~CannySegmentationLevelSetFunction() {}
00110
00111 CannySegmentationLevelSetFunction(const Self&);
00112 void operator=(const Self&);
00113
00114 private:
00115 ScalarValueType m_Variance;
00116 double m_Threshold;
00117 typename CannyEdgeDetectionImageFilter<ImageType,ImageType>::Pointer m_Canny;
00118 typename DanielssonDistanceMapImageFilter<ImageType,ImageType>::Pointer m_Distance;
00119 typename CastImageFilter<FeatureImageType, ImageType>::Pointer m_Caster;
00120
00121
00122 };
00123
00124 }
00125
00126 #ifndef ITK_MANUAL_INSTANTIATION
00127 #include "itkCannySegmentationLevelSetFunction.txx"
00128 #endif
00129
00130 #endif
00131