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 if( sIt->FrontId == 0 )
84 node.FrontId = nodes.size( ) + 1;
86 node.FrontId = sIt->FrontId;
90 sIt->IsUnified = false;
97 // -------------------------------------------------------------------------
98 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
100 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
101 _ConfigureOutput( const TOutputValue& v )
103 const TInputImage* in = this->GetInput( );
105 TOutputImage* out = this->GetOutput( );
106 out->SetLargestPossibleRegion( in->GetLargestPossibleRegion( ) );
107 out->SetRequestedRegion( in->GetRequestedRegion( ) );
108 out->SetBufferedRegion( in->GetBufferedRegion( ) );
109 out->SetSpacing( in->GetSpacing( ) );
110 out->SetOrigin( in->GetOrigin( ) );
111 out->SetDirection( in->GetDirection( ) );
113 out->FillBuffer( v );
115 TMarks* marks = this->GetMarks( );
116 marks->SetLargestPossibleRegion( in->GetLargestPossibleRegion( ) );
117 marks->SetRequestedRegion( in->GetRequestedRegion( ) );
118 marks->SetBufferedRegion( in->GetBufferedRegion( ) );
119 marks->SetSpacing( in->GetSpacing( ) );
120 marks->SetOrigin( in->GetOrigin( ) );
121 marks->SetDirection( in->GetDirection( ) );
123 marks->FillBuffer( TFrontId( 0 ) );
126 // -------------------------------------------------------------------------
127 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
129 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
130 TNeighborhood fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
131 _GetNeighbors( const TVertex& v ) const
133 typename TInputImage::RegionType region =
134 this->GetInput( )->GetRequestedRegion( );
135 TNeighborhood neighborhood;
136 if( this->m_NeigborhoodOrder != 1 )
142 for( unsigned int d = 0; d < TInputImage::ImageDimension; ++d )
144 for( int s = -1; s <= 1; s += 2 )
148 if( region.IsInside( n ) )
149 neighborhood.push_back( n );
156 return( neighborhood );
159 // -------------------------------------------------------------------------
160 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
162 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
164 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
165 _GetInputValue( const TVertex& v ) const
167 return( this->GetInput( )->GetPixel( v ) );
170 // -------------------------------------------------------------------------
171 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
173 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
174 TOutputValue fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
175 _GetOutputValue( const TVertex& v ) const
177 return( this->GetOutput( )->GetPixel( v ) );
180 // -------------------------------------------------------------------------
181 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
183 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
184 _UpdateOutputValue( TNode& n )
186 this->GetOutput( )->SetPixel( n.Vertex, n.Value );
189 // -------------------------------------------------------------------------
190 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
192 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
193 _IsMarked( const TVertex& v ) const
195 return( this->GetMarks( )->GetPixel( v ) > 0 );
198 // -------------------------------------------------------------------------
199 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
201 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
202 _GetMark( const TVertex& v ) const
204 return( ( unsigned long )( this->GetMarks( )->GetPixel( v ) ) );
207 // -------------------------------------------------------------------------
208 template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface >
210 fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >::
211 _Mark( const TVertex& v, unsigned long frontId )
213 this->GetMarks( )->SetPixel( v, TFrontId( frontId ) );
216 #endif // __fpa__Image__Algorithm__hxx__