// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Image__Dijkstra__h__ #define __fpa__Image__Dijkstra__h__ #include #include #include #include #include #include namespace fpa { namespace Image { /** */ template< class _TInputImage, class _TOutputImage > class Dijkstra : public fpa::Base::Dijkstra< fpa::Image::Filter< _TInputImage, _TOutputImage >, fpa::Image::MarksInterface< _TInputImage::ImageDimension >, fpa::Base::SeedsInterface< typename _TInputImage::IndexType, typename _TInputImage::IndexType::LexicographicCompare >, fpa::Image::MinimumSpanningTree< _TInputImage::ImageDimension > > { public: // Interfaces typedef fpa::Image::Filter< _TInputImage, _TOutputImage > TFilter; typedef fpa::Image::MarksInterface< _TInputImage::ImageDimension > TMarksInterface; typedef fpa::Base::SeedsInterface< typename _TInputImage::IndexType, typename _TInputImage::IndexType::LexicographicCompare > TSeedsInterface; typedef fpa::Image::MinimumSpanningTree< _TInputImage::ImageDimension > TMST; // Smart pointers typedef Dijkstra Self; typedef fpa::Base::Dijkstra< TFilter, TMarksInterface, TSeedsInterface, TMST > Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef typename TFilter::TInputImage TInputImage; typedef typename TFilter::TOutputValue TOutputValue; typedef typename TFilter::TVertex TVertex; public: itkNewMacro( Self ); itkTypeMacro( fpa::Image::Dijkstra, fpa::Base::Dijkstra ); protected: Dijkstra( ) : Superclass( ) { } virtual ~Dijkstra( ) { } virtual void _ConfigureOutputs( const TOutputValue& init_value ) override { this->Superclass::_ConfigureOutputs( init_value ); typename TVertex::OffsetType o; o.Fill( 0 ); const TInputImage* input = this->GetInput( ); TMST* mst = this->GetMinimumSpanningTree( ); mst->CopyInformation( input ); mst->SetBufferedRegion( input->GetRequestedRegion( ) ); mst->Allocate( ); mst->FillBuffer( o ); } virtual void GenerateData( ) override { // Configure functors with input image typedef typename TFilter::TInputImage _TInputIage; typedef typename TFilter::TOutputValue _TOutputValue; typedef fpa::Image::Functors::VertexParentBase< _TInputImage, _TOutputValue > _TVFunc; _TVFunc* vfunc = dynamic_cast< _TVFunc* >( this->m_VertexFunctor.GetPointer( ) ); if( vfunc != NULL ) vfunc->SetImage( this->GetInput( ) ); // Ok, continue this->Superclass::GenerateData( ); } private: Dijkstra( const Self& other ); Self& operator=( const Self& other ); }; } // ecapseman } // ecapseman #endif // __fpa__Image__Dijkstra__h__ // eof - $RCSfile$