1 #include "ImageRegionGrow.h"
3 #include <cpPlugins/Interface/Image.h>
4 #include <cpPlugins/Interface/PointList.h>
6 #include <fpaPlugins/GrowFunction.h>
8 #include <fpa/Image/RegionGrow.h>
9 #include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
10 #include <fpa/VTK/Image2DObserver.h>
11 #include <fpa/VTK/Image3DObserver.h>
13 #include <vtkRenderWindow.h>
14 #include <vtkRenderWindowInteractor.h>
16 // -------------------------------------------------------------------------
17 fpaPlugins::ImageRegionGrow::
21 this->_AddInput( "Input" );
22 this->_AddInput( "GrowFunction" );
23 this->_AddInput( "Seeds" );
24 this->_AddOutput< cpPlugins::Interface::Image >( "Output" );
26 this->m_Parameters->ConfigureAsBool( "VisualDebug" );
27 this->m_Parameters->ConfigureAsBool( "StopAtOneFront" );
28 this->m_Parameters->ConfigureAsReal( "InsideValue" );
29 this->m_Parameters->ConfigureAsReal( "OutsideValue" );
30 // TODO: this->m_Parameters->ConfigureAsPointList( "Seeds" );
32 this->m_Parameters->SetBool( "VisualDebug", false );
33 this->m_Parameters->SetBool( "StopAtOneFront", false );
34 this->m_Parameters->SetReal( "InsideValue", 1 );
35 this->m_Parameters->SetReal( "OutsideValue", 0 );
37 std::vector< std::string > orders;
38 orders.push_back( "1" );
39 orders.push_back( "2" );
40 this->m_Parameters->ConfigureAsChoices( "NeighborhoodOrder", orders );
41 this->m_Parameters->SetSelectedChoice( "NeighborhoodOrder", "1" );
44 // -------------------------------------------------------------------------
45 fpaPlugins::ImageRegionGrow::
50 // -------------------------------------------------------------------------
51 std::string fpaPlugins::ImageRegionGrow::
54 cpPlugins::Interface::Image* input =
55 this->GetInput< cpPlugins::Interface::Image >( "Input" );
57 return( "fpaPlugins::ImageRegionGrow: No input image." );
59 itk::DataObject* image = NULL;
61 cpPlugins_Image_Demangle_AllScalarTypes( 2, input, image, r, _GD0 );
62 else cpPlugins_Image_Demangle_AllScalarTypes( 3, input, image, r, _GD0 );
63 else r = "fpaPlugins::ImageRegionGrow: Input image type not supported.";
67 // -------------------------------------------------------------------------
69 std::string fpaPlugins::ImageRegionGrow::
70 _GD0( itk::DataObject* data )
72 typedef unsigned char _TOutPixel;
73 typedef itk::Image< _TOutPixel, I::ImageDimension > _TOut;
74 typedef fpa::Image::RegionGrow< I, _TOut > _TFilter;
75 typedef typename _TFilter::TGrowingFunction _TFunctor;
76 typedef typename I::PointType _TPoint;
78 cpPlugins::Interface::PointList* seeds =
79 this->GetInput< cpPlugins::Interface::PointList >( "Seeds" );
81 return( "fpaPlugins::ImageRegionGrow: No given seeds." );
82 I* image = dynamic_cast< I* >( data );
84 // Create filter and connect input
85 _TFilter* filter = this->_CreateITK< _TFilter >( );
86 filter->SetInput( image );
88 // Connect grow functor (or create a tautology)
89 typename _TFunctor::Pointer functor;
90 cpPlugins::Interface::DataObject* functor_wrapper =
91 this->GetInput< cpPlugins::Interface::DataObject >( "GrowFunction" );
92 if( functor_wrapper != NULL )
93 functor = functor_wrapper->GetITK< _TFunctor >( );
94 if( functor.IsNull( ) )
96 fpa::Image::Functors::RegionGrowAllBelongsFunction< I >::New( );
97 filter->SetGrowingFunction( functor );
99 // Set numeric parameters
100 Superclass::TParameters* params = this->m_Parameters;
101 std::string order = params->GetSelectedChoice( "NeighborhoodOrder" );
102 filter->SetNeighborhoodOrder( order[ 0 ] - '0' );
103 filter->SetStopAtOneFront( params->GetBool( "StopAtOneFront" ) );
104 filter->SetInsideValue( _TOutPixel( params->GetReal( "InsideValue" ) ) );
105 filter->SetOutsideValue( _TOutPixel( params->GetReal( "OutsideValue" ) ) );
108 filter->ClearSeeds( );
109 for( unsigned int s = 0; s < seeds->GetNumberOfPoints( ); ++s )
111 _TPoint pnt = seeds->GetPoint< _TPoint >( s );
112 typename I::IndexType idx;
113 if( image->TransformPhysicalPointToIndex( pnt, idx ) )
114 filter->AddSeed( idx, 0 );
118 // Connect visual debugger
120 this->m_Parameters->GetBool( "VisualDebug" ) &&
121 this->m_Interactors.size( ) > 0
124 if( I::ImageDimension == 2 )
127 fpa::VTK::Image2DObserver< _TFilter, vtkRenderWindow >
131 auto iIt = this->m_Interactors.begin( );
132 iIt != this->m_Interactors.end( );
136 typename _TDebugger::Pointer debugger = _TDebugger::New( );
137 debugger->SetRenderWindow( ( *iIt )->GetRenderWindow( ) );
138 debugger->SetRenderPercentage( 0.01 );
139 filter->AddObserver( itk::AnyEvent( ), debugger );
142 filter->ThrowEventsOn( );
144 else if( I::ImageDimension == 3 )
154 cpPlugins::Interface::Image* out =
155 this->GetOutput< cpPlugins::Interface::Image >( "Output" );
158 out->SetITK< _TOut >( filter->GetOutput( ) );
162 return( "fpaPlugins::ImageRegionGrow: output not correctly created." );