--- /dev/null
+// -------------------------------------------------------------------------
+// @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
+// -------------------------------------------------------------------------
+
+#ifndef __cpExtensions__Algorithms__ImageToBoundingBoxFromThreshold__hxx__
+#define __cpExtensions__Algorithms__ImageToBoundingBoxFromThreshold__hxx__
+
+#include <limits>
+#include <itkImageRegionConstIteratorWithIndex.h>
+
+// -------------------------------------------------------------------------
+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$