]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Filters/Image/ExtractAxis.hxx
...
[FrontAlgorithms.git] / lib / fpa / Filters / Image / ExtractAxis.hxx
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5 #ifndef __fpa__Filters__Image__ExtractAxis__hxx__
6 #define __fpa__Filters__Image__ExtractAxis__hxx__
7
8 #include <itkSignedMaurerDistanceMapImageFilter.h>
9 #include <fpa/Functors/Dijkstra/Invert.h>
10
11 // -------------------------------------------------------------------------
12 template< class _TInputImage, class _TScalar >
13 itk::ModifiedTimeType
14 fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
15 GetMTime( ) const
16 {
17   itk::ModifiedTimeType a = this->Superclass::GetMTime( );
18   itk::ModifiedTimeType b = this->m_Centerness->GetMTime( );
19   itk::ModifiedTimeType c = this->m_Dijkstra->GetMTime( );
20   a = ( a < b )? a: b;
21   return( ( a < c )? a: c );
22 }
23
24 // -------------------------------------------------------------------------
25 template< class _TInputImage, class _TScalar >
26 void fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
27 AddSeed( const TIndex& seed )
28 {
29   this->m_Dijkstra->AddSeed( seed );
30 }
31
32 // -------------------------------------------------------------------------
33 template< class _TInputImage, class _TScalar >
34 void fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
35 AddSeed( const TPoint& seed )
36 {
37   this->m_Dijkstra->AddSeed( seed );
38 }
39
40 // -------------------------------------------------------------------------
41 template< class _TInputImage, class _TScalar >
42 void fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
43 ClearSeeds( )
44 {
45   this->m_Dijkstra->ClearSeeds( );
46 }
47
48 // -------------------------------------------------------------------------
49 template< class _TInputImage, class _TScalar >
50 void fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
51 SetInput( TInputImage* input )
52 {
53   this->Superclass::SetNthInput( 0, input );
54 }
55
56 // -------------------------------------------------------------------------
57 template< class _TInputImage, class _TScalar >
58 typename fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
59 TInputImage* fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
60 GetInput( )
61 {
62   return( dynamic_cast< TInputImage* >( this->Superclass::GetInput( 0 ) ) );
63 }
64
65 // -------------------------------------------------------------------------
66 template< class _TInputImage, class _TScalar >
67 const typename fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
68 TInputImage* fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
69 GetInput( ) const
70 {
71   return(
72     dynamic_cast< const TInputImage* >( this->Superclass::GetInput( 0 ) )
73     );
74 }
75
76 // -------------------------------------------------------------------------
77 template< class _TInputImage, class _TScalar >
78 typename fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
79 TPath* fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
80 GetOutput( )
81 {
82   return( dynamic_cast< TPath* >( this->Superclass::GetOutput( 0 ) ) );
83 }
84
85 // -------------------------------------------------------------------------
86 template< class _TInputImage, class _TScalar >
87 const typename fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
88 TPath* fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
89 GetOutput( ) const
90 {
91   return( dynamic_cast< const TPath* >( this->Superclass::GetOutput( 0 ) ) );
92 }
93
94 // -------------------------------------------------------------------------
95 template< class _TInputImage, class _TScalar >
96 fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
97 ExtractAxis( )
98   : Superclass( )
99 {
100   // I/O configuration
101   this->SetNumberOfRequiredInputs( 1 );
102   this->SetNumberOfRequiredOutputs( 1 );
103   this->SetNthOutput( 0, TPath::New( ) );
104
105   // Prepare weight function
106   typedef fpa::Functors::Dijkstra::Invert< TScalar > _TWeight;
107   typename _TWeight::Pointer weight = _TWeight::New( );
108   weight->SetAlpha( 1 );
109   weight->SetBeta( 1 );
110
111   // Filters
112   typedef itk::SignedMaurerDistanceMapImageFilter< TInputImage, TScalarImage > _TDefaultCenterness;
113   typename _TDefaultCenterness::Pointer dc = _TDefaultCenterness::New( );
114   dc->InsideIsPositiveOn( );
115   dc->SquaredDistanceOn( );
116   dc->UseImageSpacingOn( );
117   this->m_Centerness = dc;
118
119   // Axis extractor
120   this->m_Dijkstra = TDijkstra::New( );
121   this->m_Dijkstra->SetWeightFunction( weight );
122   this->m_Dijkstra->StopAtOneFront( );
123 }
124
125 // -------------------------------------------------------------------------
126 template< class _TInputImage, class _TScalar >
127 fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
128 ~ExtractAxis( )
129 {
130 }
131
132 // -------------------------------------------------------------------------
133 template< class _TInputImage, class _TScalar >
134 void fpa::Filters::Image::ExtractAxis< _TInputImage, _TScalar >::
135 GenerateData( )
136 {
137   // Execute minipipeline
138   this->m_Centerness->SetInput( this->GetInput( ) );
139   this->m_Dijkstra->SetInput( this->m_Centerness->GetOutput( ) );
140   this->m_Dijkstra->Update( );
141
142   // Extract axis
143   typename TPath::Pointer out = this->GetOutput( );
144   this->m_Dijkstra->GetMinimumSpanningTree( )->GetPath(
145     out, this->m_StartIndex, this->m_EndIndex
146     );
147 }
148
149 #endif // __fpa__Filters__Image__ExtractAxis__hxx__
150 // eof - $RCSfile$