00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkSegmentationLevelSetImageFilter_h_
00018 #define __itkSegmentationLevelSetImageFilter_h_
00019
00020 #include "itkSparseFieldLevelSetImageFilter.h"
00021 #include "itkSegmentationLevelSetFunction.h"
00022
00023 namespace itk {
00024
00142 template <class TInputImage,
00143 class TFeatureImage,
00144 class TOutputPixelType = float,
00145 class TOutputImage = Image<TOutputPixelType,
00146 ::itk::GetImageDimension<TInputImage>::ImageDimension> >
00147 class ITK_EXPORT SegmentationLevelSetImageFilter
00148 : public SparseFieldLevelSetImageFilter<TInputImage, TOutputImage>
00149 {
00150 public:
00152 typedef SegmentationLevelSetImageFilter Self;
00153 typedef SparseFieldLevelSetImageFilter<TInputImage, TOutputImage> Superclass;
00154 typedef SmartPointer<Self> Pointer;
00155 typedef SmartPointer<const Self> ConstPointer;
00156
00158 typedef typename Superclass::ValueType ValueType;
00159 typedef typename Superclass::IndexType IndexType;
00160 typedef typename Superclass::TimeStepType TimeStepType;
00161 typedef typename Superclass::InputImageType InputImageType;
00162
00164 typedef TOutputImage OutputImageType;
00165 typedef TFeatureImage FeatureImageType;
00166
00168 typedef SegmentationLevelSetFunction<OutputImageType, FeatureImageType>
00169 SegmentationFunctionType;
00170
00172 typedef typename SegmentationFunctionType::VectorImageType VectorImageType;
00173
00175 itkTypeMacro(SegmentationLevelSetImageFilter, SparseFieldLevelSetImageFilter);
00176
00179 itkSetMacro(MaximumRMSError, ValueType);
00180 itkGetMacro(MaximumRMSError, ValueType);
00181
00184 itkSetMacro(MaximumIterations, unsigned int);
00185 itkGetMacro(MaximumIterations, unsigned int);
00186
00189 virtual void SetFeatureImage(const FeatureImageType *f)
00190 {
00191 this->ProcessObject::SetNthInput( 1, const_cast< FeatureImageType * >(f) );
00192 m_SegmentationFunction->SetFeatureImage(f);
00193 }
00194 virtual FeatureImageType * GetFeatureImage()
00195 { return ( static_cast< FeatureImageType *>(this->ProcessObject::GetInput(1)) ); }
00196
00199 virtual void SetInitialImage(InputImageType *f)
00200 {
00201 this->SetInput(f);
00202 }
00203
00204 virtual const typename SegmentationFunctionType::ImageType *GetSpeedImage() const
00205 { return m_SegmentationFunction->GetSpeedImage(); }
00206
00207 virtual const typename SegmentationFunctionType::VectorImageType *GetAdvectionImage() const
00208 { return m_SegmentationFunction->GetAdvectionImage(); }
00209
00213 void SetUseNegativeFeaturesOn()
00214 {
00215 itkWarningMacro( << "SetUseNegativeFeaturesOn has been deprecated. Please use ReverseExpansionDirectionOn() instead" );
00216 this->ReverseExpansionDirectionOn();
00217 }
00218 void SetUseNegativeFeaturesOff()
00219 {
00220 itkWarningMacro( << "SetUseNegativeFeaturesOff has been deprecated. Please use ReverseExpansionDirectionOff() instead" );
00221 this->ReverseExpansionDirectionOff();
00222 }
00223
00226 void SetUseNegativeFeatures( bool u )
00227 {
00228 itkWarningMacro( << "SetUseNegativeFeatures has been deprecated. Please use SetReverseExpansionDirection instead" );
00229 if (u == true)
00230 {
00231 this->SetReverseExpansionDirection(false);
00232 }
00233 else
00234 {
00235 this->SetReverseExpansionDirection(true);
00236 }
00237 }
00238 bool GetUseNegativeFeatures() const
00239 {
00240 itkWarningMacro( << "GetUseNegativeFeatures has been deprecated. Please use GetReverseExpansionDirection() instead" );
00241 if ( m_ReverseExpansionDirection == false)
00242 {
00243 return true;
00244 }
00245 else
00246 {
00247 return false;
00248 }
00249 }
00250
00259 itkSetMacro(ReverseExpansionDirection, bool);
00260 itkGetMacro(ReverseExpansionDirection, bool);
00261 itkBooleanMacro(ReverseExpansionDirection);
00262
00267 void SetFeatureScaling(ValueType v)
00268 {
00269 if (v != m_SegmentationFunction->GetPropagationWeight())
00270 {
00271 this->SetPropagationScaling(v);
00272 }
00273 if (v != m_SegmentationFunction->GetAdvectionWeight())
00274 {
00275 this->SetAdvectionScaling(v);
00276 }
00277 }
00278
00281 void SetPropagationScaling(ValueType v)
00282 {
00283 if (v != m_SegmentationFunction->GetPropagationWeight())
00284 {
00285 m_SegmentationFunction->SetPropagationWeight(v);
00286 this->Modified();
00287 }
00288 }
00289 ValueType GetPropagationScaling() const
00290 {
00291 return m_SegmentationFunction->GetPropagationWeight();
00292 }
00293
00296 void SetAdvectionScaling(ValueType v)
00297 {
00298 if (v != m_SegmentationFunction->GetAdvectionWeight())
00299 {
00300 m_SegmentationFunction->SetAdvectionWeight(v);
00301 this->Modified();
00302 }
00303 }
00304 ValueType GetAdvectionScaling() const
00305 {
00306 return m_SegmentationFunction->GetAdvectionWeight();
00307 }
00308
00312 void SetCurvatureScaling(ValueType v)
00313 {
00314 if (v != m_SegmentationFunction->GetCurvatureWeight())
00315 {
00316 m_SegmentationFunction->SetCurvatureWeight(v);
00317 this->Modified();
00318 }
00319 }
00320 ValueType GetCurvatureScaling() const
00321 {
00322 return m_SegmentationFunction->GetCurvatureWeight();
00323 }
00324
00325
00327 void SetUseMinimalCurvature( bool b )
00328 {
00329 if ( m_SegmentationFunction->GetUseMinimalCurvature() != b)
00330 {
00331 m_SegmentationFunction->SetUseMinimalCurvature( b );
00332 this->Modified();
00333 }
00334 }
00335 bool GetUseMinimalCurvature() const
00336 {
00337 return m_SegmentationFunction->GetUseMinimalCurvature();
00338 }
00339 void UseMinimalCurvatureOn()
00340 {
00341 this->SetUseMinimalCurvature(true);
00342 }
00343 void UseMinimalCurvatureOff()
00344 {
00345 this->SetUseMinimalCurvature(false);
00346 }
00347
00348
00351 virtual void SetSegmentationFunction(SegmentationFunctionType *s);
00352 virtual SegmentationFunctionType *GetSegmentationFunction()
00353 { return m_SegmentationFunction; }
00354
00355
00360 void SetMaximumCurvatureTimeStep(double n)
00361 {
00362 if ( n != m_SegmentationFunction->GetMaximumCurvatureTimeStep() )
00363 {
00364 m_SegmentationFunction->SetMaximumCurvatureTimeStep(n);
00365 this->Modified();
00366 }
00367 }
00368 double GetMaximumCurvatureTimeStep() const
00369 {
00370 return m_SegmentationFunction->GetMaximumCurvatureTimeStep();
00371 }
00372
00377 void SetMaximumPropagationTimeStep(double n)
00378 {
00379 if (n != m_SegmentationFunction->GetMaximumPropagationTimeStep() )
00380 {
00381 m_SegmentationFunction->SetMaximumPropagationTimeStep(n);
00382 this->Modified();
00383 }
00384 }
00385 double GetMaximumPropagationTimeStep() const
00386 {
00387 return m_SegmentationFunction->GetMaximumPropagationTimeStep();
00388 }
00389 protected:
00390 virtual ~SegmentationLevelSetImageFilter() {}
00391 SegmentationLevelSetImageFilter(const Self&);
00392 SegmentationLevelSetImageFilter();
00393
00394 virtual void PrintSelf(std::ostream& os, Indent indent) const;
00395
00397 virtual void InitializeIteration()
00398 {
00399 Superclass::InitializeIteration();
00400
00401 this->SetProgress( (float) ((float)this->GetElapsedIterations()
00402 / (float)this->GetMaximumIterations()) );
00403 }
00404
00407 void GenerateData();
00408
00411 bool Halt();
00412
00415 bool m_ReverseExpansionDirection;
00416
00417 private:
00418 unsigned int m_MaximumIterations;
00419 SegmentationFunctionType *m_SegmentationFunction;
00420 ValueType m_MaximumRMSError;
00421 };
00422
00423 }
00424
00425 #ifndef ITK_MANUAL_INSTANTIATION
00426 #include "itkSegmentationLevelSetImageFilter.txx"
00427 #endif
00428
00429 #endif
00430