]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Image/ExtractAxisFilter.hxx
5c3c4e6f0257bb42ed998e69effe9101315c160a
[FrontAlgorithms.git] / lib / fpa / Image / ExtractAxisFilter.hxx
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5
6 #ifndef __fpa__Image__ExtractAxisFilter__hxx__
7 #define __fpa__Image__ExtractAxisFilter__hxx__
8
9 #include <itkSignedMaurerDistanceMapImageFilter.h>
10 #include <fpa/Image/Functors/Dijkstra/Invert.h>
11
12 // -------------------------------------------------------------------------
13 template< class _TInputImage, class _TScalar >
14 itk::ModifiedTimeType
15 fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
16 GetMTime( ) const
17 {
18   itk::ModifiedTimeType a = this->Superclass::GetMTime( );
19   itk::ModifiedTimeType b = this->m_Centerness->GetMTime( );
20   itk::ModifiedTimeType c = this->m_Dijkstra->GetMTime( );
21   a = ( a < b )? a: b;
22   return( ( a < c )? a: c );
23 }
24
25 // -------------------------------------------------------------------------
26 template< class _TInputImage, class _TScalar >
27 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
28 AddSeed( const TIndex& seed )
29 {
30   this->m_Dijkstra->AddSeed( seed );
31 }
32
33 // -------------------------------------------------------------------------
34 template< class _TInputImage, class _TScalar >
35 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
36 AddSeed( const TPoint& seed )
37 {
38   this->m_Dijkstra->AddSeed( seed );
39 }
40
41 // -------------------------------------------------------------------------
42 template< class _TInputImage, class _TScalar >
43 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
44 ClearSeeds( )
45 {
46   this->m_Dijkstra->ClearSeeds( );
47 }
48
49 // -------------------------------------------------------------------------
50 template< class _TInputImage, class _TScalar >
51 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
52 SetInput( TInputImage* input )
53 {
54   this->Superclass::SetNthInput( 0, input );
55 }
56
57 // -------------------------------------------------------------------------
58 template< class _TInputImage, class _TScalar >
59 typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
60 TInputImage* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
61 GetInput( )
62 {
63   return( dynamic_cast< TInputImage* >( this->Superclass::GetInput( 0 ) ) );
64 }
65
66 // -------------------------------------------------------------------------
67 template< class _TInputImage, class _TScalar >
68 const typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
69 TInputImage* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
70 GetInput( ) const
71 {
72   return(
73     dynamic_cast< const TInputImage* >( this->Superclass::GetInput( 0 ) )
74     );
75 }
76
77 // -------------------------------------------------------------------------
78 template< class _TInputImage, class _TScalar >
79 typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
80 TPath* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
81 GetOutput( )
82 {
83   return( dynamic_cast< TPath* >( this->Superclass::GetOutput( 0 ) ) );
84 }
85
86 // -------------------------------------------------------------------------
87 template< class _TInputImage, class _TScalar >
88 const typename fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
89 TPath* fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
90 GetOutput( ) const
91 {
92   return( dynamic_cast< const TPath* >( this->Superclass::GetOutput( 0 ) ) );
93 }
94
95 // -------------------------------------------------------------------------
96 template< class _TInputImage, class _TScalar >
97 fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
98 ExtractAxisFilter( )
99   : Superclass( )
100 {
101   // I/O configuration
102   this->SetNumberOfRequiredInputs( 1 );
103   this->SetNumberOfRequiredOutputs( 1 );
104   this->SetNthOutput( 0, TPath::New( ) );
105
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 );
111
112   // Filters
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( );
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::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
128 ~ExtractAxisFilter( )
129 {
130 }
131
132 // -------------------------------------------------------------------------
133 template< class _TInputImage, class _TScalar >
134 void fpa::Image::ExtractAxisFilter< _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( )->GetPolyLineParametricPath(
145     out, this->m_StartIndex, this->m_EndIndex
146     );
147 }
148
149 #endif // __fpa__Image__ExtractAxisFilter__hxx__
150
151 // eof - $RCSfile$