00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkNarrowBandLevelSetImageFilter_h_
00018
#define __itkNarrowBandLevelSetImageFilter_h_
00019
00020
#include "itkNarrowBandImageFilterBase.h"
00021
#include "itkSegmentationLevelSetFunction.h"
00022
#include "itkFastChamferDistanceImageFilter.h"
00023
#include "itkIsoContourDistanceImageFilter.h"
00024
00025
namespace itk {
00026
00139
template <
class TInputImage,
00140
class TFeatureImage,
00141
class TOutputPixelType =
float,
00142
class TOutputImage = Image<TOutputPixelType,
00143 ::itk::GetImageDimension<TInputImage>::ImageDimension> >
00144 class ITK_EXPORT NarrowBandLevelSetImageFilter
00145 :
public NarrowBandImageFilterBase<TInputImage, TOutputImage>
00146 {
00147
public:
00149
typedef NarrowBandLevelSetImageFilter
Self;
00150 typedef NarrowBandImageFilterBase<TInputImage, TOutputImage> Superclass;
00151 typedef SmartPointer<Self> Pointer;
00152 typedef SmartPointer<const Self> ConstPointer;
00153
00155
typedef typename Superclass::ValueType
ValueType;
00156 typedef typename Superclass::IndexType
IndexType;
00157 typedef typename Superclass::TimeStepType
TimeStepType;
00158 typedef typename Superclass::InputImageType
InputImageType;
00159
00161
typedef TOutputImage
OutputImageType;
00162 typedef TFeatureImage
FeatureImageType;
00163
00165
typedef SegmentationLevelSetFunction <OutputImageType, FeatureImageType>
00166
SegmentationFunctionType;
00167
00169
typedef typename SegmentationFunctionType::VectorImageType
VectorImageType;
00170
00172
itkTypeMacro(NarrowBandLevelSetImageFilter,
NarrowBandImageFilterBase);
00173
00176
itkSetMacro(MaximumRMSError,
ValueType);
00177
itkGetMacro(MaximumRMSError,
ValueType);
00178
00181
itkSetMacro(MaximumIterations,
unsigned int);
00182
itkGetMacro(MaximumIterations,
unsigned int);
00183
00186
virtual void SetFeatureImage(
const FeatureImageType *f)
00187 {
00188 this->ProcessObject::SetNthInput( 1, const_cast< FeatureImageType * >(f) );
00189 m_SegmentationFunction->SetFeatureImage(f);
00190 }
00191
virtual FeatureImageType * GetFeatureImage()
00192 {
00193
return ( static_cast< FeatureImageType *>(this->ProcessObject::GetInput(1)) );
00194 }
00195
00198
virtual void SetInitialImage(InputImageType *f)
00199 {
00200 this->SetInput(f);
00201 }
00202
00203
virtual const typename SegmentationFunctionType::ImageType *GetSpeedImage()
const
00204
{
return m_SegmentationFunction->GetSpeedImage(); }
00205
00206
virtual const typename SegmentationFunctionType::VectorImageType *GetAdvectionImage()
const
00207 {
return m_SegmentationFunction->GetAdvectionImage(); }
00208
00212
void SetUseNegativeFeaturesOn()
00213 {
00214
itkWarningMacro( <<
"SetUseNegativeFeaturesOn has been deprecated. Please use ReverseExpansionDirectionOn() instead" );
00215 this->ReverseExpansionDirectionOn();
00216 }
00217
void SetUseNegativeFeaturesOff()
00218 {
00219
itkWarningMacro( <<
"SetUseNegativeFeaturesOff has been deprecated. Please use ReverseExpansionDirectionOff() instead" );
00220 this->ReverseExpansionDirectionOff();
00221 }
00222
00225
void SetUseNegativeFeatures(
bool u )
00226 {
00227
itkWarningMacro( <<
"SetUseNegativeFeatures has been deprecated. Please use SetReverseExpansionDirection instead" );
00228
if (u ==
true)
00229 {
00230 this->SetReverseExpansionDirection(
false);
00231 }
00232
else
00233 {
00234 this->SetReverseExpansionDirection(
true);
00235 }
00236 }
00237
bool GetUseNegativeFeatures()
const
00238
{
00239
itkWarningMacro( <<
"GetUseNegativeFeatures has been deprecated. Please use GetReverseExpansionDirection() instead" );
00240
if ( this->GetUseNegativeFeatures() ==
false)
00241 {
00242 return true;
00243 }
00244
else
00245 {
00246
return false;
00247 }
00248 }
00249
00258
itkSetMacro(ReverseExpansionDirection,
bool);
00259
itkGetMacro(ReverseExpansionDirection,
bool);
00260
itkBooleanMacro(ReverseExpansionDirection);
00261
00266
void SetFeatureScaling(ValueType v)
00267 {
00268
if (v != m_SegmentationFunction->GetPropagationWeight())
00269 {
00270 this->SetPropagationScaling(v);
00271 }
00272
if (v != m_SegmentationFunction->GetAdvectionWeight())
00273 {
00274 this->SetAdvectionScaling(v);
00275 }
00276 }
00277
00280
void SetPropagationScaling(ValueType v)
00281 {
00282
if (v != m_SegmentationFunction->GetPropagationWeight())
00283 {
00284 m_SegmentationFunction->SetPropagationWeight(v);
00285 }
00286 }
00287 ValueType GetPropagationScaling()
const
00288 {
00289
return m_SegmentationFunction->GetPropagationWeight();
00290 }
00291
00294
void SetAdvectionScaling(ValueType v)
00295 {
00296
if (v != m_SegmentationFunction->GetAdvectionWeight())
00297 {
00298 m_SegmentationFunction->SetAdvectionWeight(v);
00299 }
00300 }
00301 ValueType GetAdvectionScaling()
const
00302
{
00303 return m_SegmentationFunction->GetAdvectionWeight();
00304 }
00305
00309
void SetCurvatureScaling(ValueType v)
00310 {
00311
if (v != m_SegmentationFunction->GetCurvatureWeight())
00312 {
00313 m_SegmentationFunction->SetCurvatureWeight(v);
00314 }
00315 }
00316 ValueType GetCurvatureScaling()
const
00317
{
00318
return m_SegmentationFunction->GetCurvatureWeight();
00319 }
00320
00323
virtual void SetSegmentationFunction(SegmentationFunctionType *s);
00324
virtual SegmentationFunctionType *GetSegmentationFunction()
00325 {
return m_SegmentationFunction; }
00326
00327
protected:
00328
virtual ~NarrowBandLevelSetImageFilter() {}
00329 NarrowBandLevelSetImageFilter();
00330 NarrowBandLevelSetImageFilter(
const Self &);
00331
00332
virtual void PrintSelf(std::ostream& os,
Indent indent)
const;
00333
void operator=(
const Self&);
00334
00336
virtual void InitializeIteration()
00337 {
00338 Superclass::InitializeIteration();
00339
00340 this->SetProgress( (
float) ((
float)this->GetElapsedIterations()
00341 / (
float)this->GetMaximumIterations()) );
00342 }
00343
00347
virtual void CreateNarrowBand ();
00348
00351
void GenerateData();
00352
00355
bool Halt();
00356
00359
bool m_ReverseExpansionDirection;
00360
00363
typedef IsoContourDistanceImageFilter<OutputImageType,OutputImageType>
00364
IsoFilterType;
00365
typedef FastChamferDistanceImageFilter<OutputImageType,OutputImageType>
00366
ChamferFilterType;
00367
00368
typename IsoFilterType::Pointer m_IsoFilter;
00369
typename ChamferFilterType::Pointer m_ChamferFilter;
00370
00371
private:
00372 unsigned int m_MaximumIterations;
00373
SegmentationFunctionType *m_SegmentationFunction;
00374
ValueType m_MaximumRMSError;
00375 };
00376
00377 }
00378
00379
#ifndef ITK_MANUAL_INSTANTIATION
00380 #include "itkNarrowBandLevelSetImageFilter.txx"
00381
#endif
00382
00383 #endif
00384