00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkSegmentationLevelSetFunction_h_
00018
#define __itkSegmentationLevelSetFunction_h_
00019
00020
#include "itkLevelSetFunction.h"
00021
#include "itkLinearInterpolateImageFunction.h"
00022
#include "itkVectorLinearInterpolateImageFunction.h"
00023
#include "itkVectorCastImageFilter.h"
00024
00025
namespace itk {
00026
00044
template <
class TImageType,
class TFeatureImageType = TImageType>
00045 class ITK_EXPORT SegmentationLevelSetFunction
00046 :
public LevelSetFunction<TImageType>
00047 {
00048
public:
00050 typedef SegmentationLevelSetFunction
Self;
00051 typedef LevelSetFunction<TImageType> Superclass;
00052 typedef SmartPointer<Self> Pointer;
00053 typedef SmartPointer<const Self> ConstPointer;
00054
00056
itkTypeMacro( SegmentationLevelSetFunction,
LevelSetFunction );
00057
00059 typedef typename Superclass::ImageType
ImageType;
00060 typedef typename Superclass::RadiusType
RadiusType;
00061 typedef TFeatureImageType
FeatureImageType;
00062 typedef typename Superclass::FloatOffsetType
FloatOffsetType;
00063 typedef typename Superclass::ScalarValueType
ScalarValueType;
00064 typedef typename Superclass::NeighborhoodType
NeighborhoodType;
00065 typedef typename FeatureImageType::PixelType
FeatureScalarType;
00066 typedef typename ImageType::IndexType
IndexType;
00067 typedef typename Superclass::VectorType
VectorType;
00068 typedef typename Superclass::GlobalDataStruct
GlobalDataStruct;
00069
00071
typedef Image<
VectorType,
00072 ::itk::GetImageDimension<TImageType>::ImageDimension >
VectorImageType;
00073
00074
00076 typedef LinearInterpolateImageFunction<ImageType> InterpolatorType;
00077
00079 typedef VectorLinearInterpolateImageFunction<VectorImageType> VectorInterpolatorType;
00080
00082 typedef typename InterpolatorType::ContinuousIndexType
ContinuousIndexType;
00083
00085
itkStaticConstMacro(ImageDimension,
unsigned int,Superclass::ImageDimension);
00086
00088 virtual const FeatureImageType *GetFeatureImage()
const
00089
{
return m_FeatureImage.GetPointer(); }
00090 virtual void SetFeatureImage(
const FeatureImageType *f)
00091 { m_FeatureImage = f; }
00092
00094
virtual ImageType *GetSpeedImage()
00095 {
return m_SpeedImage.GetPointer(); }
00096
void SetSpeedImage( ImageType *s )
00097 { m_SpeedImage = s; }
00098
00100
virtual VectorImageType *GetAdvectionImage()
const
00101
{
return m_AdvectionImage.GetPointer(); }
00102 void SetAdvectionImage(
VectorImageType *s )
00103 { m_AdvectionImage = s; }
00104
00105
00109
virtual void Initialize(
const RadiusType &r);
00110
00115
virtual void CalculateSpeedImage() {}
00116
00121
virtual void CalculateAdvectionImage() {}
00122
00125
virtual void AllocateSpeedImage();
00126
00129
virtual void AllocateAdvectionImage();
00130
00141
virtual void ReverseExpansionDirection();
00142
00143
protected:
00145
typename FeatureImageType::ConstPointer m_FeatureImage;
00146
00148 typename ImageType::Pointer m_SpeedImage;
00149
00151 typename VectorImageType::Pointer m_AdvectionImage;
00152
00154 Functor::VectorCast<
ITK_TYPENAME VectorInterpolatorType::OutputType,
00155
VectorType > m_VectorCast;
00156
00158 virtual ScalarValueType PropagationSpeed(
const NeighborhoodType &,
00159
const FloatOffsetType &,
GlobalDataStruct *gd)
const;
00160
00162
virtual VectorType AdvectionField(
const NeighborhoodType &,
00163
const FloatOffsetType &,
GlobalDataStruct *gd)
const;
00164
00165
00166
virtual ~SegmentationLevelSetFunction() {}
00167 SegmentationLevelSetFunction()
00168 {
00169 m_SpeedImage =
ImageType::New();
00170 m_AdvectionImage =
VectorImageType::New();
00171 m_Interpolator =
InterpolatorType::New();
00172 m_VectorInterpolator =
VectorInterpolatorType::New();
00173 }
00174
00175
typename InterpolatorType::Pointer m_Interpolator;
00176
typename VectorInterpolatorType::Pointer m_VectorInterpolator;
00177
00178 };
00179
00180 }
00181
00182
#ifndef ITK_MANUAL_INSTANTIATION
00183
#include "itkSegmentationLevelSetFunction.txx"
00184
#endif
00185
00186
#endif