#ifndef __FPA__IMAGE__ALGORITHM__H__ #define __FPA__IMAGE__ALGORITHM__H__ #include #include namespace fpa { namespace Image { namespace Functors { /** */ template< class VV, class C > class CastVertexValueToCost : public itk::FunctionBase< VV, C > { public: // Type-related and pointers typedef CastVertexValueToCost Self; typedef itk::FunctionBase< VV, C > Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; public: itkNewMacro( Self ); itkTypeMacro( CastVertexValueToCost, itkFunctionBase ); public: virtual C Evaluate( const VV& v ) const { return( C( v ) ); } protected: CastVertexValueToCost( ) : Superclass( ) { } virtual ~CastVertexValueToCost( ) { } private: // Purposely not implemented CastVertexValueToCost( const Self& ); void operator=( const Self& ); }; /** */ template< class VV, class C > class CastVertexValueToConstantCost : public itk::FunctionBase< VV, C > { public: // Type-related and pointers typedef CastVertexValueToConstantCost Self; typedef itk::FunctionBase< VV, C > Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; public: itkNewMacro( Self ); itkTypeMacro( CastVertexValueToConstantCost, itkFunctionBase ); public: virtual C Evaluate( const VV& v ) const { return( C( 1 ) ); } protected: CastVertexValueToConstantCost( ) : Superclass( ) { } virtual ~CastVertexValueToConstantCost( ) { } private: // Purposely not implemented CastVertexValueToConstantCost( const Self& ); void operator=( const Self& ); }; } // ecapseman /** * A generic front propagation algorithm were vertices are image pixels. * * @param I Input image type * @param A Base algorithm (RegionGrow, Dijkstra or FastMarching) */ template< class I, class A, class CC > class Algorithm : public A { public: /// Standard class typdedefs typedef Algorithm Self; typedef A Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; /// Template input values typedef I TInputImage; typedef A TBaseAlgorithm; typedef CC TCostConversionFunction; typedef typename A::TTraits TTraits; typedef typename TTraits::TCost TCost; typedef typename TTraits::TResult TResult; typedef typename TTraits::TVertex TVertex; typedef typename TTraits::TVertexValue TVertexValue; typedef itk::Image< TResult, I::ImageDimension > TOutputImage; protected: typedef typename TTraits::TFrontId _TFrontId; typedef typename TTraits::TNode _TNode; typedef typename TTraits::TNodes _TNodes; private: typedef itk::Image< bool, I::ImageDimension > _TMarks; typedef itk::Image< _TFrontId, I::ImageDimension > _TFrontsIds; typedef itk::Image< TVertex, I::ImageDimension > _TParents; public: itkTypeMacro( Algorithm, TAlgorithm ); /// Set/Get itkGetConstMacro( NeighborhoodOrder, unsigned int ); itkGetConstObjectMacro( CostConversion, TCostConversionFunction ); itkGetObjectMacro( CostConversion, TCostConversionFunction ); itkSetMacro( NeighborhoodOrder, unsigned int ); itkSetObjectMacro( CostConversion, TCostConversionFunction ); protected: Algorithm( ); virtual ~Algorithm( ); /// Base interface virtual bool _UpdateResult( _TNode& n ); /// Pure virtual interface: vertices virtual unsigned long _NumberOfVertices ( ) const; virtual TVertexValue _Value ( const TVertex& v ) const; virtual TResult _Result ( const TVertex& v ) const; /// Pure virtual interface: edges virtual double _Norm ( const TVertex& a, const TVertex& b ) const; virtual bool _Edge ( const TVertex& a, const TVertex& b ) const; virtual TCost _Cost ( const TVertex& a, const TVertex& b ) const; /// Pure virtual interface: neighborhood virtual void _Neighs ( const _TNode& n, _TNodes& N ) const; virtual void _NeighsInDim ( const _TNode& n, const unsigned int& d, _TNodes& N ); /// Pure virtual interface: results virtual void _InitializeResults ( ); private: Algorithm( const Self& ); // Not impl. void operator=( const Self& ); // Not impl. protected: unsigned int m_NeighborhoodOrder; typename TCostConversionFunction::Pointer m_CostConversion; }; } // ecapseman } // ecapseman #include #endif // __FPA__IMAGE__ALGORITHM__H__ // eof - $RCSfile$