]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Image/ExtractAxisFilter.hxx
9d14fe4ef18ca53e15bb029c38266a0e5980c4eb
[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< TScalarImage, 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   typename _TDefaultCenterness::Pointer dc = _TDefaultCenterness::New( );
115   dc->InsideIsPositiveOn( );
116   dc->SquaredDistanceOn( );
117   dc->UseImageSpacingOn( );
118   this->m_Centerness = dc;
119
120   // Axis extractor
121   this->m_Dijkstra = TDijkstra::New( );
122   this->m_Dijkstra->SetWeightFunction( weight );
123   this->m_Dijkstra->StopAtOneFront( );
124 }
125
126 // -------------------------------------------------------------------------
127 template< class _TInputImage, class _TScalar >
128 fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
129 ~ExtractAxisFilter( )
130 {
131 }
132
133 // -------------------------------------------------------------------------
134 template< class _TInputImage, class _TScalar >
135 void fpa::Image::ExtractAxisFilter< _TInputImage, _TScalar >::
136 GenerateData( )
137 {
138   // Execute minipipeline
139   this->m_Centerness->SetInput( this->GetInput( ) );
140   this->m_Dijkstra->SetInput( this->m_Centerness->GetOutput( ) );
141   this->m_Dijkstra->Update( );
142
143   // Extract axis
144   typename TPath::Pointer out = this->GetOutput( );
145   this->m_Dijkstra->GetMinimumSpanningTree( )->GetPolyLineParametricPath(
146     out, this->m_StartIndex, this->m_EndIndex
147     );
148 }
149
150 #endif // __fpa__Image__ExtractAxisFilter__hxx__
151
152 // eof - $RCSfile$