// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Image__RegionGrow__hxx__ #define __fpa__Image__RegionGrow__hxx__ #include // ------------------------------------------------------------------------- template< class _TInputImage, class _TOutputImage > void fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: SetPredicate( TIntensityFunctor* functor ) { if( this->m_IntensityFunctor.GetPointer( ) != functor ) { this->m_IntensityFunctor = functor; this->Modified( ); } // fi } // ------------------------------------------------------------------------- template< class _TInputImage, class _TOutputImage > void fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: AddSeed( const TIndex& seed ) { if( this->m_Seeds.insert( seed ).second ) this->Modified( ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TOutputImage > fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: RegionGrow( ) : Superclass( ), m_InsideValue( TInputPixel( 0 ) ), m_OutsideValue( TInputPixel( 0 ) ) { } // ------------------------------------------------------------------------- template< class _TInputImage, class _TOutputImage > fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: ~RegionGrow( ) { } // ------------------------------------------------------------------------- template< class _TInputImage, class _TOutputImage > void fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: GenerateInputRequestedRegion( ) { this->Superclass::GenerateInputRequestedRegion( ); if( this->GetInput( ) ) { TInputImage* input = const_cast< TInputImage* >( this->GetInput( ) ); input->SetRequestedRegionToLargestPossibleRegion( ); } // fi } // ------------------------------------------------------------------------- template< class _TInputImage, class _TOutputImage > void fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: EnlargeOutputRequestedRegion( itk::DataObject* output ) { this->Superclass::EnlargeOutputRequestedRegion( output ); output->SetRequestedRegionToLargestPossibleRegion( ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TOutputImage > void fpa::Image::RegionGrow< _TInputImage, _TOutputImage >:: GenerateData( ) { const TInputImage* input = this->GetInput( ); TOutputImage* output = this->GetOutput( ); TRegion region = input->GetRequestedRegion( ); // Configure output output->SetBufferedRegion( region ); output->Allocate( ); output->FillBuffer( this->m_OutsideValue ); // Init marks typedef itk::Image< bool, TInputImage::ImageDimension > _TMarks; typename _TMarks::Pointer marks = _TMarks::New( ); marks->CopyInformation( input ); marks->SetRequestedRegion( region ); marks->SetBufferedRegion( input->GetBufferedRegion( ) ); marks->Allocate( ); marks->FillBuffer( false ); // Init queue std::queue< TIndex > q; for( TIndex seed: this->m_Seeds ) q.push( seed ); // Main loop while( q.size( ) > 0 ) { // Get next candidate TIndex node = q.front( ); q.pop( ); if( marks->GetPixel( node ) ) continue; marks->SetPixel( node, true ); // Apply inclusion predicate TInputPixel value = input->GetPixel( node ); bool inside = false; if( this->m_IntensityFunctor.IsNotNull( ) ) inside = this->m_IntensityFunctor->Evaluate( value ); if( !inside ) continue; // Ok, pixel lays inside region output->SetPixel( node, this->m_InsideValue ); // Add neighborhood for( unsigned int d = 0; d < TInputImage::ImageDimension; ++d ) { TIndex neigh = node; for( int i = -1; i <= 1; i += 2 ) { neigh[ d ] = node[ d ] + i; if( region.IsInside( neigh ) ) q.push( neigh ); } // rof } // rof } // elihw } #endif // __fpa__Image__RegionGrow__hxx__ // eof - $RCSfile$