// ------------------------------------------------------------------------- // @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co) // ------------------------------------------------------------------------- #ifndef __cpExtensions__Algorithms__ImageToBoundingBoxFromThreshold__hxx__ #define __cpExtensions__Algorithms__ImageToBoundingBoxFromThreshold__hxx__ #include #include // ------------------------------------------------------------------------- template< class _TImage > void cpExtensions::Algorithms::ImageToBoundingBoxFromThreshold< _TImage >:: Compute( ) { typedef itk::ImageRegionConstIteratorWithIndex< _TImage > _TIt; TIndex min_idx, max_idx; min_idx.Fill( 0 ); max_idx.Fill( -1 ); if( this->m_Image.IsNotNull( ) ) { auto region = this->m_Image->GetRequestedRegion( ); min_idx = max_idx = region.GetIndex( ); min_idx += region.GetSize( ); _TIt i( this->m_Image, region ); for( i.GoToBegin( ); !i.IsAtEnd( ); ++i ) { auto v = i.Get( ); if( this->m_LowerThreshold <= v && v <= this->m_UpperThreshold ) { auto idx = i.GetIndex( ); for( unsigned int d = 0; d < _TImage::ImageDimension; ++d ) { min_idx[ d ] = ( idx[ d ] < min_idx[ d ] )? idx[ d ]: min_idx[ d ]; max_idx[ d ] = ( idx[ d ] > max_idx[ d ] )? idx[ d ]: max_idx[ d ]; } // rof } // fi } // rof // Fix indices for( unsigned int d = 0; d < _TImage::ImageDimension; ++d ) { min_idx[ d ] -= long( this->m_PAD ); max_idx[ d ] += long( this->m_PAD ); if( min_idx[ d ] < region.GetIndex( )[ d ] ) min_idx[ d ] = region.GetIndex( )[ d ]; if( max_idx[ d ] > region.GetIndex( )[ d ] + region.GetSize( )[ d ] ) max_idx[ d ] = region.GetIndex( )[ d ] + region.GetSize( )[ d ]; } // rof } // fi typename _TImage::SizeType size; for( unsigned int d = 0; d < _TImage::ImageDimension; ++d ) size[ d ] = max_idx[ d ] - min_idx[ d ] + 1; this->m_Region.SetIndex( min_idx ); this->m_Region.SetSize( size ); } // ------------------------------------------------------------------------- template< class _TImage > cpExtensions::Algorithms::ImageToBoundingBoxFromThreshold< _TImage >:: ImageToBoundingBoxFromThreshold( ) : Superclass( ), m_LowerThreshold( std::numeric_limits< TPixel >::min( ) ), m_UpperThreshold( std::numeric_limits< TPixel >::max( ) ), m_PAD( 0 ) { } // ------------------------------------------------------------------------- template< class _TImage > cpExtensions::Algorithms::ImageToBoundingBoxFromThreshold< _TImage >:: ~ImageToBoundingBoxFromThreshold( ) { } #endif // __cpExtensions__Algorithms__ImageToBoundingBoxFromThreshold__hxx__ // eof - $RCSfile$