]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/Algorithms/CPRImageFilter.hxx
...
[cpPlugins.git] / lib / cpExtensions / Algorithms / CPRImageFilter.hxx
1 #ifndef __cpExtensions__Algorithms__CPRImageFilter__hxx__
2 #define __cpExtensions__Algorithms__CPRImageFilter__hxx__
3
4 #include <itkImageRegionIterator.h>
5 #include <itkImageSliceIteratorWithIndex.h>
6 #include <itkMinimumMaximumImageCalculator.h>
7
8 // -------------------------------------------------------------------------
9 template< class _TImage, class _TCurve >
10 _TCurve* cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
11 GetCurve( )
12 {
13   return(
14     dynamic_cast< _TCurve* >( this->itk::ProcessObject::GetInput( 1 ) )
15     );
16 }
17
18 // -------------------------------------------------------------------------
19 template< class _TImage, class _TCurve >
20 const _TCurve* cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
21 GetCurve( ) const
22 {
23   return(
24     dynamic_cast< const _TCurve* >( this->itk::ProcessObject::GetInput( 1 ) )
25     );
26 }
27
28 // -------------------------------------------------------------------------
29 template< class _TImage, class _TCurve >
30 void cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
31 SetCurve( _TCurve* curve )
32 {
33   this->itk::ProcessObject::SetNthInput( 1, curve );
34 }
35
36 // -------------------------------------------------------------------------
37 template< class _TImage, class _TCurve >
38 cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
39 CPRImageFilter( )
40   : Superclass( ),
41     m_SliceRadius( 0 )
42 {
43   this->Superclass::SetNumberOfRequiredInputs( 2 );
44 }
45
46 // -------------------------------------------------------------------------
47 template< class _TImage, class _TCurve >
48 cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
49 ~CPRImageFilter( )
50 {
51 }
52
53 // -------------------------------------------------------------------------
54 template< class _TImage, class _TCurve >
55 void cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
56 GenerateOutputInformation( )
57 {
58 }
59
60 // -------------------------------------------------------------------------
61 template< class _TImage, class _TCurve >
62 void cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
63 GenerateInputRequestedRegion( )
64 {
65   TImage* input = const_cast< TImage* >( this->GetInput( ) );
66   if( input != NULL )
67     input->SetRequestedRegionToLargestPossibleRegion( );
68 }
69
70 // -------------------------------------------------------------------------
71 template< class _TImage, class _TCurve >
72 void cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
73 GenerateData( )
74 {
75   typedef itk::MinimumMaximumImageCalculator< _TImage >           _TMinMax;
76   typedef itk::ImageSliceIteratorWithIndex< _TImage >               _T3DIt;
77   typedef itk::ImageRegionIterator< typename TSlicer::TSliceImage > _T2DIt;
78
79   auto input = this->GetInput( );
80   auto curve = this->GetCurve( );
81   auto output = this->GetOutput( );
82
83   // Compute image intensity range
84   typename _TMinMax::Pointer minmax = _TMinMax::New( );
85   minmax->SetImage( input );
86   minmax->Compute( );
87
88   // Prepare slicer
89   typename TSlicer::Pointer slicer = TSlicer::New( );
90   slicer->SetInput( input );
91   slicer->SetDefaultValue( minmax->GetMinimum( ) );
92   slicer->SpacingFromMinimumOn( );
93   if( this->m_Interpolator.IsNotNull( ) )
94     slicer->SetInterpolator( this->m_Interpolator );
95   slicer->SizeFromMaximumOff( );
96   if( this->m_SliceRadius > double( 0 ) )
97   {
98     slicer->SizeFromMinimumOff( );
99     slicer->SetSize( this->m_SliceRadius );
100   }
101   else
102     slicer->SizeFromMinimumOn( );
103
104   // Slice image
105   _T3DIt oIt( output, output->GetRequestedRegion( ) );
106   oIt.SetFirstDirection( 1 );
107   oIt.SetSecondDirection( 2 );
108   oIt.GoToBegin( );
109   unsigned long N = curve->GetNumberOfPoints( );
110   for( unsigned long n = 0; n < N; ++n )
111   {
112     slicer->SetTranslation( curve->GetPoint( n ) );
113     slicer->SetRotation( curve->GetFrame( n ) );
114     slicer->Update( );
115
116     // Fill output image
117     _T2DIt sIt(
118       slicer->GetOutput( ), slicer->GetOutput( )->GetRequestedRegion( )
119       );
120     for( sIt.GoToBegin( ); !sIt.IsAtEnd( ); ++sIt )
121     {
122       oIt.Set( sIt.Get( ) );
123       ++oIt;
124       if( oIt.IsAtEndOfLine( ) )
125         oIt.NextLine( );
126       if( oIt.IsAtEndOfSlice( ) )
127         oIt.NextSlice( );
128
129     } // rof
130
131   } // rof
132 }
133
134 #endif // __cpExtensions__Algorithms__CPRImageFilter__hxx__
135
136 // eof - $RCSfile$