X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FImage%2FAlgorithm.hxx;h=ed7342130ba2389b6c64bbbac1dfc3208259ae01;hb=026b2fe203089e1917ab78ebafb3131f147223f5;hp=7800a549576e7f378b1454ed39013d5996c72cff;hpb=9622bd5b833a8845881003228207e0caca59b081;p=FrontAlgorithms.git diff --git a/lib/fpa/Image/Algorithm.hxx b/lib/fpa/Image/Algorithm.hxx index 7800a54..ed73421 100644 --- a/lib/fpa/Image/Algorithm.hxx +++ b/lib/fpa/Image/Algorithm.hxx @@ -1,180 +1,123 @@ -#ifndef __FPA__IMAGE__ALGORITHM__HXX__ -#define __FPA__IMAGE__ALGORITHM__HXX__ +#ifndef __fpa__Image__Algorithm__hxx__ +#define __fpa__Image__Algorithm__hxx__ -#include -#include -#include +// Send Piotr's code to Anna + +#include +#include // ------------------------------------------------------------------------- -template< class I, class A > -fpa::Image::Algorithm< I, A >:: +template< class _TInputImage, class _TOutputImage > +fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: Algorithm( ) - : Superclass( ), - m_NeighborhoodOrder( 1 ) + : Superclass( ) { -} + typedef itk::ImageBase< _TInputImage::ImageDimension > _TImageBase; + typedef fpa::Image::Functors::SimpleNeighborhood< _TImageBase > _TNeigh; + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; -// ------------------------------------------------------------------------- -template< class I, class A > -fpa::Image::Algorithm< I, A >:: -~Algorithm( ) -{ -} + this->m_MarksIdx = this->GetNumberOfRequiredOutputs( ); + this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MarksIdx + 1 ); + typename _TMarks::Pointer marks = _TMarks::New( ); + this->SetNthOutput( this->m_MarksIdx, marks ); -// ------------------------------------------------------------------------- -template< class I, class A > -bool fpa::Image::Algorithm< I, A >:: -_UpdateResult( _TNode& n ) -{ - bool ret = this->Superclass::_UpdateResult( n ); - this->GetOutput( )->SetPixel( n.Vertex, n.Result ); - return( ret ); + typename _TNeigh::Pointer neigh = _TNeigh::New( ); + this->SetNeighborhoodFunction( neigh ); } // ------------------------------------------------------------------------- -template< class I, class A > -unsigned long fpa::Image::Algorithm< I, A >:: -_NumberOfVertices( ) const -{ - return( - this->GetInput( )->GetLargestPossibleRegion( ).GetNumberOfPixels( ) - ); -} - -// ------------------------------------------------------------------------- -template< class I, class A > -typename fpa::Image::Algorithm< I, A >:: -TVertexValue fpa::Image::Algorithm< I, A >:: -_Value( const TVertex& v ) const +template< class _TInputImage, class _TOutputImage > +fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +~Algorithm( ) { - return( this->GetInput( )->GetPixel( v ) ); } // ------------------------------------------------------------------------- -template< class I, class A > -typename fpa::Image::Algorithm< I, A >:: -TResult fpa::Image::Algorithm< I, A >:: -_Result( const TVertex& v ) const +template< class _TInputImage, class _TOutputImage > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_BeforeGenerateData( ) { - return( this->GetOutput( )->GetPixel( v ) ); + this->Superclass::_BeforeGenerateData( ); + this->AllocateOutputs( ); + + TNeighborhoodFunction* neighFunc = + dynamic_cast< TNeighborhoodFunction* >( + this->GetNeighborhoodFunction( ) + ); + if( neighFunc == NULL ) + itkExceptionMacro( << "NeighborhoodFunction not well defined." ); + neighFunc->SetImage( this->GetInput( ) ); } // ------------------------------------------------------------------------- -template< class I, class A > -double fpa::Image::Algorithm< I, A >:: -_Norm( const TVertex& a, const TVertex& b ) const +template< class _TInputImage, class _TOutputImage > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_InitMarks( ) { - typename I::PointType pa, pb; - this->GetInput( )->TransformIndexToPhysicalPoint( a, pa ); - this->GetInput( )->TransformIndexToPhysicalPoint( b, pb ); - return( double( pa.EuclideanDistanceTo( pb ) ) ); + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + _TMarks* marks = + dynamic_cast< _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + marks->FillBuffer( 0 ); } // ------------------------------------------------------------------------- -template< class I, class A > -bool fpa::Image::Algorithm< I, A >:: -_Edge( const TVertex& a, const TVertex& b ) const +template< class _TInputImage, class _TOutputImage > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_InitResults( const TOutput& init_value ) { - unsigned long dist = 0; - for( unsigned int d = 0; d < I::ImageDimension; d++ ) - dist += std::abs( long( a[ d ] ) - long( b[ d ] ) ); - if( this->m_NeighborhoodOrder == 1 ) - return( dist == 0 || dist == 1 ); - else - return( dist == 0 || dist == 1 || dist == 2 ); + this->GetOutput( )->FillBuffer( init_value ); } // ------------------------------------------------------------------------- -template< class I, class A > -typename fpa::Image::Algorithm< I, A >:: -TCost fpa::Image::Algorithm< I, A >:: -_Cost( const TVertex& a, const TVertex& b ) const +template< class _TInputImage, class _TOutputImage > +bool fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_IsMarked( const TVertex& v ) const { - static const TCost INF_COST = std::numeric_limits< TCost >::max( ); - if( this->_Edge( a, b ) ) - { - TCost c = TCost( this->GetInput( )->GetPixel( b ) ); - if( this->m_CostConversion.IsNotNull( ) ) - return( this->m_CostConversion->Evaluate( c ) ); - else - return( c ); - } - else - return( INF_COST ); + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + const _TMarks* marks = + dynamic_cast< const _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + return( marks->GetPixel( v ) != 0 ); } // ------------------------------------------------------------------------- -template< class I, class A > -void fpa::Image::Algorithm< I, A >:: -_Neighs( const _TNode& n, _TNodes& N ) const +template< class _TInputImage, class _TOutputImage > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_Mark( const _TQueueNode& n ) { - typename I::RegionType reg = this->GetInput( )->GetRequestedRegion( ); - - N.clear( ); - if( this->m_NeighborhoodOrder == 1 ) - { - for( unsigned int d = 0; d < I::ImageDimension; d++ ) - { - for( int i = -1; i <= 1; i += 2 ) - { - TVertex v = n.Vertex; - v[ d ] += i; - if( reg.IsInside( v ) ) - N.push_back( _TNode( v, n.FrontId ) ); - else - N.push_back( n ); - - } // rof - - } // rof - } - else - { - typedef itk::ConstNeighborhoodIterator< I > TNeighIt; - typename I::SizeType nSize; - nSize.Fill( 1 ); - - TNeighIt nIt( nSize, this->GetInput( ), reg ); - nIt.SetLocation( n.Vertex ); - for( unsigned int i = 0; i < nIt.Size( ); i++ ) - { - TVertex idxN = nIt.GetIndex( i ); - if( idxN == n.Vertex ) - continue; - if( !reg.IsInside( idxN ) ) - continue; - N.push_back( _TNode( idxN, n.FrontId ) ); - - } // rof - - } // fi + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + _TMarks* marks = + dynamic_cast< _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + marks->SetPixel( n.Vertex, n.FrontId ); } // ------------------------------------------------------------------------- -template< class I, class A > -void fpa::Image::Algorithm< I, A >:: -_NeighsInDim( const _TNode& n, const unsigned int& d, _TNodes& N ) +template< class _TInputImage, class _TOutputImage > +typename fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +TFrontId fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_GetMark( const TVertex& v ) const { - typename I::RegionType reg = this->GetInput( )->GetRequestedRegion( ); - - N.clear( ); - for( int i = -1; i <= 1; i += 2 ) - { - TVertex v = n.Vertex; - v[ d ] += i; - if( reg.IsInside( v ) ) - N.push_back( _TNode( v, n.FrontId ) ); - - } // rof + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + const _TMarks* marks = + dynamic_cast< const _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + return( marks->GetPixel( v ) ); } // ------------------------------------------------------------------------- -template< class I, class A > -void fpa::Image::Algorithm< I, A >:: -_InitializeResults( ) +template< class _TInputImage, class _TOutputImage > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_UpdateResult( const _TQueueNode& n ) { + this->GetOutput( )->SetPixel( n.Vertex, n.Result ); } -#endif // __FPA__IMAGE__ALGORITHM__HXX__ +#endif // __fpa__Image__Algorithm__hxx__ // eof - $RCSfile$