00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkThresholdSegmentationLevelSetFunction_h_
00018 #define __itkThresholdSegmentationLevelSetFunction_h_
00019
00020 #include "itkSegmentationLevelSetFunction.h"
00021 #include "itkNumericTraits.h"
00022 namespace itk {
00023
00052 template <class TImageType, class TFeatureImageType = TImageType>
00053 class ITK_EXPORT ThresholdSegmentationLevelSetFunction
00054 : public SegmentationLevelSetFunction<TImageType, TFeatureImageType>
00055 {
00056 public:
00058 typedef ThresholdSegmentationLevelSetFunction Self;
00059 typedef SegmentationLevelSetFunction<TImageType, TFeatureImageType> Superclass;
00060 typedef SmartPointer<Self> Pointer;
00061 typedef SmartPointer<const Self> ConstPointer;
00062 typedef TFeatureImageType FeatureImageType;
00063
00065 itkNewMacro(Self);
00066
00068 itkTypeMacro( ThresholdSegmentationLevelSetFunction, SegmentationLevelSetFunction );
00069
00071 typedef typename Superclass::ImageType ImageType;
00072 typedef typename Superclass::ScalarValueType ScalarValueType;
00073 typedef typename Superclass::FeatureScalarType FeatureScalarType;
00074 typedef typename Superclass::RadiusType RadiusType;
00075
00077 itkStaticConstMacro(ImageDimension, unsigned int,
00078 Superclass::ImageDimension);
00079
00081 void SetUpperThreshold(FeatureScalarType f)
00082 { m_UpperThreshold = f; }
00083 FeatureScalarType GetUpperThreshold() const
00084 { return m_UpperThreshold; }
00085 void SetLowerThreshold(FeatureScalarType f)
00086 { m_LowerThreshold = f; }
00087 FeatureScalarType GetLowerThreshold() const
00088 { return m_LowerThreshold; }
00089
00090 virtual void CalculateSpeedImage();
00091
00092 virtual void Initialize(const RadiusType &r)
00093 {
00094 Superclass::Initialize(r);
00095
00096 this->SetAdvectionWeight( NumericTraits<ScalarValueType>::Zero);
00097 this->SetPropagationWeight(-1.0 * NumericTraits<ScalarValueType>::One);
00098 this->SetCurvatureWeight(NumericTraits<ScalarValueType>::One);
00099 }
00100
00103 void SetEdgeWeight(const ScalarValueType p)
00104 {
00105 m_EdgeWeight = p;
00106 }
00107 ScalarValueType GetEdgeWeight() const
00108 {
00109 return m_EdgeWeight;
00110 }
00111
00115 void SetSmoothingConductance(const ScalarValueType p)
00116 {
00117 m_SmoothingConductance = p;
00118 }
00119 ScalarValueType GetSmoothingConductance() const
00120 {
00121 return m_SmoothingConductance;
00122 }
00123
00127 void SetSmoothingIterations(const int p)
00128 {
00129 m_SmoothingIterations = p;
00130 }
00131 int GetSmoothingIterations() const
00132 {
00133 return m_SmoothingIterations;
00134 }
00135
00139 void SetSmoothingTimeStep(const ScalarValueType i)
00140 {
00141 m_SmoothingTimeStep = i;
00142 }
00143 ScalarValueType GetSmoothingTimeStep() const
00144 {
00145 return m_SmoothingTimeStep;
00146 }
00147
00148 protected:
00149 ThresholdSegmentationLevelSetFunction()
00150 {
00151 m_UpperThreshold = NumericTraits<FeatureScalarType>::max();
00152 m_LowerThreshold = NumericTraits<FeatureScalarType>::NonpositiveMin();
00153 this->SetAdvectionWeight(0.0);
00154 this->SetPropagationWeight(1.0);
00155 this->SetCurvatureWeight(1.0);
00156 this->SetSmoothingIterations(5);
00157 this->SetSmoothingConductance(0.8);
00158 this->SetSmoothingTimeStep(0.1);
00159 this->SetEdgeWeight(0.0);
00160 }
00161 virtual ~ThresholdSegmentationLevelSetFunction(){}
00162
00163 ThresholdSegmentationLevelSetFunction(const Self&);
00164 void operator=(const Self&);
00165
00166 void PrintSelf(std::ostream& os, Indent indent) const
00167 {
00168 Superclass::PrintSelf(os, indent );
00169 os << indent << "UpperThreshold: " << m_UpperThreshold << std::endl;
00170 os << indent << "LowerThreshold: " << m_LowerThreshold << std::endl;
00171 os << indent << "EdgeWeight: " << m_EdgeWeight << std::endl;
00172 os << indent << "SmoothingTimeStep: " << m_SmoothingTimeStep << std::endl;
00173 os << indent << "SmoothingIterations: " << m_SmoothingIterations << std::endl;
00174 os << indent << "SmoothingConductance: " << m_SmoothingConductance << std::endl;
00175 }
00176
00177 FeatureScalarType m_UpperThreshold;
00178 FeatureScalarType m_LowerThreshold;
00179 ScalarValueType m_EdgeWeight;
00180 ScalarValueType m_SmoothingConductance;
00181 int m_SmoothingIterations;
00182 ScalarValueType m_SmoothingTimeStep;
00183 };
00184
00185 }
00186
00187 #ifndef ITK_MANUAL_INSTANTIATION
00188 #include "itkThresholdSegmentationLevelSetFunction.txx"
00189 #endif
00190
00191 #endif