]> Creatis software - cpPlugins.git/blob - lib/ivq/ITK/ImageROIFromFunction.hxx
d7ba4e3677186397d01cf0e30f4ef18f22f71213
[cpPlugins.git] / lib / ivq / ITK / ImageROIFromFunction.hxx
1 /* =======================================================================
2  * @author: Leonardo Florez-Valencia
3  * @email: florez-l@javeriana.edu.co
4  * =======================================================================
5  */
6
7 #ifndef __ivq__ITK__ImageROIFromFunction__hxx__
8 #define __ivq__ITK__ImageROIFromFunction__hxx__
9
10 #include <itkImageRegionConstIteratorWithIndex.h>
11
12 // -------------------------------------------------------------------------
13 template< class _TImage >
14 void ivq::ITK::ImageROIFromFunction< _TImage >::
15 Modified( ) const
16 {
17   this->Superclass::Modified( );
18   this->m_ROIUpdated = false;
19 }
20
21 // -------------------------------------------------------------------------
22 template< class _TImage >
23 void ivq::ITK::ImageROIFromFunction< _TImage >::
24 Compute( )
25 {
26   if( this->m_ROIUpdated || this->m_Image.IsNull( ) )
27     return;
28   if( this->m_Function.IsNotNull( ) )
29   {
30     // Initialize bounds
31     TRegion in_region = this->m_Image->GetRequestedRegion( );
32     TIndex iMin = in_region.GetIndex( );
33     TIndex iMax = iMin + in_region.GetSize( );
34     for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
35       iMax[ d ] -= 1;
36
37     // Compute bounds
38     typedef itk::ImageRegionConstIteratorWithIndex< TImage > _TIt;
39     _TIt it( this->m_Image, in_region );
40     TIndex i0 = iMax;
41     TIndex i1 = iMin;
42     for( it.GoToBegin( ); !it.IsAtEnd( ); ++it )
43     {
44       if( this->m_Function->Evaluate( it.Get( ) ) )
45       {
46         TIndex i = it.GetIndex( );
47         for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
48         {
49           i0[ d ] = ( i[ d ] < i0[ d ] )? i[ d ]: i0[ d ];
50           i1[ d ] = ( i1[ d ] < i[ d ] )? i[ d ]: i1[ d ];
51
52         } // rof
53
54       } // fi
55
56     } // rof
57
58     // Apply padding
59     for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
60     {
61       i0[ d ] -= this->m_Padding;
62       i1[ d ] += this->m_Padding;
63       i0[ d ] = ( i0[ d ] < iMin[ d ] )? iMin[ d ]: i0[ d ];
64       i1[ d ] = ( iMax[ d ] < i1[ d ] )? iMax[ d ]: i1[ d ];
65
66     } // rof
67
68     // Create new ROI
69     typename TImage::SizeType roi_size;
70     for( unsigned int d = 0; d < TImage::ImageDimension; ++d )
71       roi_size[ d ] = i1[ d ] - i0[ d ] + 1;
72     this->m_ROI.SetIndex( i0 );
73     this->m_ROI.SetSize( roi_size );
74   }
75   else
76     this->m_ROI = this->m_Image->GetRequestedRegion( );
77   this->m_ROIUpdated = true;
78 }
79
80 // -------------------------------------------------------------------------
81 template< class _TImage >
82 ivq::ITK::ImageROIFromFunction< _TImage >::
83 ImageROIFromFunction( )
84   : Superclass( ),
85     m_Padding( 0 ),
86     m_ROIUpdated( false )
87 {
88 }
89
90 // -------------------------------------------------------------------------
91 template< class _TImage >
92 ivq::ITK::ImageROIFromFunction< _TImage >::
93 ~ImageROIFromFunction( )
94 {
95 }
96
97 #endif // __ivq__ITK__ImageROIFromFunction__hxx__
98
99 // eof - $RCSfile$