1 #include "ImageDijkstra.h"
3 #include <cpPlugins/Interface/Image.h>
4 #include <cpPlugins/Interface/PointList.h>
6 #include <fpa/Image/Dijkstra.h>
7 #include <fpa/VTK/Image2DObserver.h>
8 #include <fpa/VTK/Image3DObserver.h>
9 #include <fpa/Base/Functors/InvertCostFunction.h>
11 #include <vtkRenderWindow.h>
12 #include <vtkRenderWindowInteractor.h>
14 // -------------------------------------------------------------------------
15 fpaPlugins::ImageDijkstra::
19 this->_AddInput( "Input" );
20 this->_AddInput( "Seeds" );
21 this->_AddOutput< cpPlugins::Interface::Image >( "Output" );
23 this->m_Parameters->ConfigureAsBool( "VisualDebug" );
24 this->m_Parameters->ConfigureAsBool( "StopAtOneFront" );
25 this->m_Parameters->SetBool( "VisualDebug", false );
26 this->m_Parameters->SetBool( "StopAtOneFront", false );
28 std::vector< std::string > orders;
29 orders.push_back( "1" );
30 orders.push_back( "2" );
31 this->m_Parameters->ConfigureAsChoices( "NeighborhoodOrder", orders );
32 this->m_Parameters->SetSelectedChoice( "NeighborhoodOrder", "1" );
35 // -------------------------------------------------------------------------
36 fpaPlugins::ImageDijkstra::
41 // -------------------------------------------------------------------------
42 std::string fpaPlugins::ImageDijkstra::
45 cpPlugins::Interface::Image* input =
46 this->GetInput< cpPlugins::Interface::Image >( "Input" );
48 return( "fpaPlugins::ImageDijkstra: No input image." );
50 itk::DataObject* image = NULL;
52 cpPlugins_Image_Demangle_AllScalarTypes( 2, input, image, r, _GD0 );
53 else cpPlugins_Image_Demangle_AllScalarTypes( 3, input, image, r, _GD0 );
54 else r = "fpaPlugins::ImageDijkstra: Input image type not supported.";
58 // -------------------------------------------------------------------------
60 std::string fpaPlugins::ImageDijkstra::
61 _GD0( itk::DataObject* data )
63 typedef typename I::PixelType _TOutPixel;
64 typedef itk::Image< _TOutPixel, I::ImageDimension > _TOut;
65 typedef fpa::Image::Dijkstra< I, _TOut > _TFilter;
66 typedef typename _TFilter::TResult _TCost;
67 typedef fpa::Base::Functors::InvertCostFunction< _TCost > _TCostFunctor;
68 typedef typename I::PointType _TPoint;
70 cpPlugins::Interface::PointList* seeds =
71 this->GetInput< cpPlugins::Interface::PointList >( "Seeds" );
73 return( "fpaPlugins::ImageRegionGrow: No given seeds." );
74 I* image = dynamic_cast< I* >( data );
76 // Create filter and connect input
77 _TFilter* filter = this->_CreateITK< _TFilter >( );
78 filter->SetInput( image );
80 // Connect cost functor
81 typename _TCostFunctor::Pointer functor = _TCostFunctor::New( );
82 filter->SetConversionFunction( functor );
84 // Set numeric parameters
85 Superclass::TParameters* params = this->m_Parameters;
86 std::string order = params->GetSelectedChoice( "NeighborhoodOrder" );
87 filter->SetNeighborhoodOrder( order[ 0 ] - '0' );
88 filter->SetStopAtOneFront( params->GetBool( "StopAtOneFront" ) );
91 filter->ClearSeeds( );
92 for( unsigned int s = 0; s < seeds->GetNumberOfPoints( ); ++s )
94 _TPoint pnt = seeds->GetPoint< _TPoint >( s );
95 typename I::IndexType idx;
96 if( image->TransformPhysicalPointToIndex( pnt, idx ) )
97 filter->AddSeed( idx, 0 );
101 // Connect visual debugger
102 std::set< unsigned long > observers;
104 this->m_Parameters->GetBool( "VisualDebug" ) &&
105 this->m_Interactors.size( ) > 0
108 if( I::ImageDimension == 2 )
111 fpa::VTK::Image2DObserver< _TFilter, vtkRenderWindow >
115 auto iIt = this->m_Interactors.begin( );
116 iIt != this->m_Interactors.end( );
120 typename _TDebugger::Pointer debugger = _TDebugger::New( );
121 debugger->SetRenderWindow( ( *iIt )->GetRenderWindow( ) );
122 debugger->SetRenderPercentage( 0.01 );
123 observers.insert( filter->AddObserver( itk::AnyEvent( ), debugger ) );
126 filter->ThrowEventsOn( );
128 else if( I::ImageDimension == 3 )
137 // Remove observers (if any)
138 for( auto oIt = observers.begin( ); oIt != observers.end( ); ++oIt )
139 filter->RemoveObserver( *oIt );
142 cpPlugins::Interface::Image* out =
143 this->GetOutput< cpPlugins::Interface::Image >( "Output" );
146 out->SetITK< _TOut >( filter->GetOutput( ) );
150 return( "fpaPlugins::ImageDijkstra: output not correctly created." );