1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #ifndef __fpa__Image__ExtractAxisFilter__hxx__
7 #define __fpa__Image__ExtractAxisFilter__hxx__
9 #include <itkSignedMaurerDistanceMapImageFilter.h>
10 #include <fpa/Image/Functors/Dijkstra/Invert.h>
12 // -------------------------------------------------------------------------
13 template< class _TInputImage, class _TScalar >
15 fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
18 itk::ModifiedTimeType a = this->Superclass::GetMTime( );
19 itk::ModifiedTimeType b = this->m_Centerness->GetMTime( );
20 itk::ModifiedTimeType c = this->m_Dijkstra->GetMTime( );
22 return( ( a < c )? a: c );
25 // -------------------------------------------------------------------------
26 template< class _TInputImage, class _TScalar >
27 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
28 AddSeed( const TIndex& seed )
30 this->m_Dijkstra->AddSeed( seed );
33 // -------------------------------------------------------------------------
34 template< class _TInputImage, class _TScalar >
35 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
36 AddSeed( const TPoint& seed )
38 this->m_Dijkstra->AddSeed( seed );
41 // -------------------------------------------------------------------------
42 template< class _TInputImage, class _TScalar >
43 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
46 this->m_Dijkstra->ClearSeeds( );
49 // -------------------------------------------------------------------------
50 template< class _TInputImage, class _TScalar >
51 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
52 SetInput( TInputImage* input )
54 this->Superclass::SetNthInput( 0, input );
57 // -------------------------------------------------------------------------
58 template< class _TInputImage, class _TScalar >
59 typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
60 TInputImage* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
63 return( dynamic_cast< TInputImage* >( this->Superclass::GetInput( 0 ) ) );
66 // -------------------------------------------------------------------------
67 template< class _TInputImage, class _TScalar >
68 const typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
69 TInputImage* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
73 dynamic_cast< const TInputImage* >( this->Superclass::GetInput( 0 ) )
77 // -------------------------------------------------------------------------
78 template< class _TInputImage, class _TScalar >
79 typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
80 TPath* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
83 return( dynamic_cast< TPath* >( this->Superclass::GetOutput( 0 ) ) );
86 // -------------------------------------------------------------------------
87 template< class _TInputImage, class _TScalar >
88 const typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
89 TPath* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
92 return( dynamic_cast< const TPath* >( this->Superclass::GetOutput( 0 ) ) );
95 // -------------------------------------------------------------------------
96 template< class _TInputImage, class _TScalar >
97 fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
102 this->SetNumberOfRequiredInputs( 1 );
103 this->SetNumberOfRequiredOutputs( 1 );
104 this->SetNthOutput( 0, TPath::New( ) );
106 // Prepare weight function
107 typedef fpa::Image::Functors::Dijkstra::Invert< TOutputImage, TScalar > _TWeight;
108 typename _TWeight::Pointer weight = _TWeight::New( );
109 weight->SetAlpha( 1 );
110 weight->SetBeta( 1 );
113 typedef itk::SignedMaurerDistanceMapImageFilter< TInputImage, TScalarImage > _TDefaultCenterness;
114 this->m_Centerness = _TDefaultCenterness::New( );
115 this->m_Centerness->InsideIsPositiveOn( );
116 this->m_Centerness->SquaredDistanceOn( );
117 this->m_Centerness->UseImageSpacingOn( );
120 this->m_Dijkstra = TDijkstra::New( );
121 this->m_Dijkstra->SetWeightFunction( weight );
122 this->m_Dijkstra->StopAtOneFront( );
125 // -------------------------------------------------------------------------
126 template< class _TInputImage, class _TScalar >
127 fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
128 ~ExtractAxisFilter( )
132 // -------------------------------------------------------------------------
133 template< class _TInputImage, class _TScalar >
134 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
137 // Execute minipipeline
138 this->m_Centerness->SetInput( this->GetInput( ) );
139 this->m_Dijkstra->SetInput( this->m_Centerness->GetOutput( ) );
140 this->m_Dijkstra->Update( );
143 typename TPath::Pointer out = this->GetOutput( );
144 this->m_Dijkstra->GetMinimumSpanningTree( )->GetPolyLineParametricPath(
145 out, this->m_StartIndex, this->m_EndIndex
149 #endif // __fpa__Image__ExtractAxisFilter__hxx__