// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Image__ExtractAxisFilter__hxx__ #define __fpa__Image__ExtractAxisFilter__hxx__ #include #include // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > itk::ModifiedTimeType fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: GetMTime( ) const { itk::ModifiedTimeType a = this->Superclass::GetMTime( ); itk::ModifiedTimeType b = this->m_Centerness->GetMTime( ); itk::ModifiedTimeType c = this->m_Dijkstra->GetMTime( ); a = ( a < b )? a: b; return( ( a < c )? a: c ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: AddSeed( const TIndex& seed ) { this->m_Dijkstra->AddSeed( seed ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: AddSeed( const TPoint& seed ) { this->m_Dijkstra->AddSeed( seed ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: ClearSeeds( ) { this->m_Dijkstra->ClearSeeds( ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: SetInput( TInputImage* input ) { this->Superclass::SetNthInput( 0, input ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: TInputImage* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: GetInput( ) { return( dynamic_cast< TInputImage* >( this->Superclass::GetInput( 0 ) ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > const typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: TInputImage* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: GetInput( ) const { return( dynamic_cast< const TInputImage* >( this->Superclass::GetInput( 0 ) ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: TPath* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: GetOutput( ) { return( dynamic_cast< TPath* >( this->Superclass::GetOutput( 0 ) ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > const typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: TPath* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: GetOutput( ) const { return( dynamic_cast< const TPath* >( this->Superclass::GetOutput( 0 ) ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: ExtractAxisFilter( ) : Superclass( ) { // I/O configuration this->SetNumberOfRequiredInputs( 1 ); this->SetNumberOfRequiredOutputs( 1 ); this->SetNthOutput( 0, TPath::New( ) ); // Prepare weight function typedef fpa::Image::Functors::Dijkstra::Invert< TScalarImage, TScalar > _TWeight; typename _TWeight::Pointer weight = _TWeight::New( ); weight->SetAlpha( 1 ); weight->SetBeta( 1 ); // Filters typedef itk::SignedMaurerDistanceMapImageFilter< TInputImage, TScalarImage > _TDefaultCenterness; typename _TDefaultCenterness::Pointer dc = _TDefaultCenterness::New( ); dc->InsideIsPositiveOn( ); dc->SquaredDistanceOn( ); dc->UseImageSpacingOn( ); this->m_Centerness = dc; // Axis extractor this->m_Dijkstra = TDijkstra::New( ); this->m_Dijkstra->SetWeightFunction( weight ); this->m_Dijkstra->StopAtOneFront( ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: ~ExtractAxisFilter( ) { } // ------------------------------------------------------------------------- template< class _TInputImage, class _TScalar > void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >:: GenerateData( ) { // Execute minipipeline this->m_Centerness->SetInput( this->GetInput( ) ); this->m_Dijkstra->SetInput( this->m_Centerness->GetOutput( ) ); this->m_Dijkstra->Update( ); // Extract axis typename TPath::Pointer out = this->GetOutput( ); this->m_Dijkstra->GetMinimumSpanningTree( )->GetPolyLineParametricPath( out, this->m_StartIndex, this->m_EndIndex ); } #endif // __fpa__Image__ExtractAxisFilter__hxx__ // eof - $RCSfile$