1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #ifndef __fpa__Image__Algorithm__hxx__
7 #define __fpa__Image__Algorithm__hxx__
9 // -------------------------------------------------------------------------
10 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
12 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
14 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
18 dynamic_cast< TMarks* >(
19 this->itk::ProcessObject::GetOutput( this->m_MarksIdx )
24 // -------------------------------------------------------------------------
25 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
27 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
29 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
33 dynamic_cast< const TMarks* >(
34 this->itk::ProcessObject::GetOutput( this->m_MarksIdx )
39 // -------------------------------------------------------------------------
40 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
41 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
44 m_NeigborhoodOrder( 1 )
46 this->m_MarksIdx = this->GetNumberOfRequiredOutputs( );
47 this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MarksIdx + 1 );
48 this->SetNthOutput( this->m_MarksIdx, TMarks::New( ) );
51 // -------------------------------------------------------------------------
52 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
53 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
58 // -------------------------------------------------------------------------
59 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
61 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
62 TNodes fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
65 const TInputImage* input = this->GetInput( );
66 typename TInputImage::RegionType region = input->GetRequestedRegion( );
67 TSeeds seeds = this->GetSeeds( );
70 typename TSeeds::iterator sIt = seeds.begin( );
71 for( ; sIt != seeds.end( ); ++sIt )
75 input->TransformPhysicalPointToIndex( sIt->Point, sIt->Vertex );
77 input->TransformIndexToPhysicalPoint( sIt->Vertex, sIt->Point );
78 if( region.IsInside( sIt->Vertex ) )
80 sIt->IsUnified = true;
81 node.Vertex = sIt->Vertex;
82 node.Parent = node.Vertex;
83 node.FrontId = nodes.size( ) + 1;
87 sIt->IsUnified = false;
94 // -------------------------------------------------------------------------
95 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
97 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
98 _ConfigureOutput( const TOutputValue& v )
100 const TInputImage* in = this->GetInput( );
102 TOutputImage* out = this->GetOutput( );
103 out->SetLargestPossibleRegion( in->GetLargestPossibleRegion( ) );
104 out->SetRequestedRegion( in->GetRequestedRegion( ) );
105 out->SetBufferedRegion( in->GetBufferedRegion( ) );
106 out->SetSpacing( in->GetSpacing( ) );
107 out->SetOrigin( in->GetOrigin( ) );
108 out->SetDirection( in->GetDirection( ) );
110 out->FillBuffer( v );
112 TMarks* marks = this->GetMarks( );
113 marks->SetLargestPossibleRegion( in->GetLargestPossibleRegion( ) );
114 marks->SetRequestedRegion( in->GetRequestedRegion( ) );
115 marks->SetBufferedRegion( in->GetBufferedRegion( ) );
116 marks->SetSpacing( in->GetSpacing( ) );
117 marks->SetOrigin( in->GetOrigin( ) );
118 marks->SetDirection( in->GetDirection( ) );
120 marks->FillBuffer( TFrontId( 0 ) );
123 // -------------------------------------------------------------------------
124 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
126 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
127 TNeighborhood fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
128 _GetNeighbors( const TVertex& v ) const
130 typename TInputImage::RegionType region =
131 this->GetInput( )->GetRequestedRegion( );
132 TNeighborhood neighborhood;
133 if( this->m_NeigborhoodOrder != 1 )
139 for( unsigned int d = 0; d < TInputImage::ImageDimension; ++d )
141 for( int s = -1; s <= 1; s += 2 )
145 if( region.IsInside( n ) )
146 neighborhood.push_back( n );
153 return( neighborhood );
156 // -------------------------------------------------------------------------
157 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
159 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
161 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
162 _GetInputValue( const TVertex& v ) const
164 return( this->GetInput( )->GetPixel( v ) );
167 // -------------------------------------------------------------------------
168 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
170 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
171 TOutputValue fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
172 _GetOutputValue( const TVertex& v ) const
174 return( this->GetOutput( )->GetPixel( v ) );
177 // -------------------------------------------------------------------------
178 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
180 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
181 _UpdateOutputValue( const TNode& n )
183 this->GetOutput( )->SetPixel( n.Vertex, n.Value );
186 // -------------------------------------------------------------------------
187 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
189 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
190 _IsMarked( const TVertex& v ) const
192 return( this->GetMarks( )->GetPixel( v ) > 0 );
195 // -------------------------------------------------------------------------
196 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
198 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
199 _GetMark( const TVertex& v ) const
201 return( ( unsigned long )( this->GetMarks( )->GetPixel( v ) ) );
204 // -------------------------------------------------------------------------
205 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
207 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
208 _Mark( const TVertex& v, unsigned long frontId )
210 this->GetMarks( )->SetPixel( v, TFrontId( frontId ) );
214 #endif // __fpa__Image__Algorithm__hxx__