1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #ifndef __fpa__tests__image__BaseFunctions__h__
7 #define __fpa__tests__image__BaseFunctions__h__
12 #include <itkImageFileReader.h>
13 #include <itkImageFileWriter.h>
15 #include <fpa/Config.h>
17 # include <itkImageToVTKImageFilter.h>
18 # include <itkVTKImageToImageFilter.h>
19 # include <vtkSmartPointer.h>
20 # include <vtkRenderWindow.h>
21 # include <ivq/VTK/ImageViewer.h>
22 # include <ivq/VTK/BrushWidget.h>
23 # include <ivq/VTK/SeedWidgetOverImageActor.h>
24 # include <fpa/Image/VisualDebugger2D.h>
33 // -------------------------------------------------------------------
34 template< class _TPointer >
37 const typename _TPointer::ObjectType::PixelType& zero,
41 typedef typename _TPointer::ObjectType _TImage;
46 typename _TImage::SizeType size;
47 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
48 size[ d ] = va_arg( vl, int );
50 typename _TImage::SpacingType spac;
51 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
52 spac[ d ] = va_arg( vl, double );
54 img = _TImage::New( );
55 img->SetRegions( size );
56 img->SetSpacing( spac );
58 img->FillBuffer( zero );
63 // -------------------------------------------------------------------
64 template< class _TPointer >
65 std::string Read( _TPointer& img, const std::string& fname )
67 typedef typename _TPointer::ObjectType _TImage;
68 typedef itk::ImageFileReader< _TImage > _TReader;
70 typename _TReader::Pointer reader = _TReader::New( );
71 reader->SetFileName( fname );
76 catch( std::exception& err )
78 return( err.what( ) );
81 img = reader->GetOutput( );
82 img->DisconnectPipeline( );
86 // -------------------------------------------------------------------
87 template< class _TImage >
88 std::string Write( const _TImage* img, const std::string& fname )
90 typedef itk::ImageFileWriter< _TImage > _TWriter;
92 typename _TWriter::Pointer writer = _TWriter::New( );
93 writer->SetInput( img );
94 writer->SetFileName( fname );
99 catch( std::exception& err )
101 return( err.what( ) );
107 // -------------------------------------------------------------------
108 template< class _TFilter >
112 typedef _TFilter TFilter;
113 typedef typename _TFilter::TInputImage TInputImage;
116 Viewer( const TInputImage* image )
119 this->m_VTKInputImage = TVTKInputImage::New( );
120 this->m_VTKInputImage->SetInput( image );
121 this->m_VTKInputImage->Update( );
123 this->m_Viewer = vtkSmartPointer< ivq::VTK::ImageViewer >::New( );
124 this->m_Viewer->SetInputData( this->m_VTKInputImage->GetOutput( ) );
132 void ActivateSeedWidget( )
136 vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor >::New( );
137 this->m_SeedWidget->SetActor( this->m_Viewer->GetImageActor( ) );
138 this->m_SeedWidget->SetInteractor(
139 this->m_Viewer->GetRenderWindow( )->GetInteractor( )
144 void ActivateBrushWidget( )
147 this->m_BrushWidget =
148 vtkSmartPointer< ivq::VTK::BrushWidget >::New( );
149 this->m_BrushWidget->SetImageActor( this->m_Viewer->GetImageActor( ) );
150 this->m_BrushWidget->SetInteractor(
151 this->m_Viewer->GetRenderWindow( )->GetInteractor( )
159 this->m_Viewer->Render( );
160 this->m_Viewer->ResetCamera( );
161 this->m_Viewer->Initialize( );
162 this->m_Viewer->Render( );
163 if( this->m_SeedWidget.GetPointer( ) != NULL )
164 this->m_SeedWidget->EnabledOn( );
165 if( this->m_BrushWidget.GetPointer( ) != NULL )
166 this->m_BrushWidget->EnabledOn( );
167 this->m_Viewer->Start( );
168 if( this->m_SeedWidget.GetPointer( ) != NULL )
169 this->m_SeedWidget->EnabledOff( );
170 if( this->m_BrushWidget.GetPointer( ) != NULL )
171 this->m_BrushWidget->EnabledOff( );
175 void AssociateSeedsTo( TFilter* filter )
178 if( this->m_SeedWidget.GetPointer( ) != NULL )
180 const ivq::VTK::SeedWidgetOverImageActor::TSeeds& wdg_seeds =
181 this->m_SeedWidget->GetSeeds( );
182 ivq::VTK::SeedWidgetOverImageActor::TSeeds::const_iterator wsIt;
183 for( wsIt = wdg_seeds.begin( ); wsIt != wdg_seeds.end( ); ++wsIt )
185 typename TInputImage::PointType pnt;
186 for( unsigned int i = 0; i < wsIt->second.size( ); i += 3 )
188 pnt[ 0 ] = wsIt->second[ i ];
189 pnt[ 1 ] = wsIt->second[ i + 1 ];
191 typename TInputImage::IndexType idx;
192 filter->GetInput( )->TransformPhysicalPointToIndex( pnt, idx );
193 filter->AddSeed( idx );
203 void AssociateLabelsTo( TFilter* filter )
206 if( this->m_BrushWidget.GetPointer( ) != NULL )
208 typedef typename TFilter::TLabelImage _TLabelImage;
209 typedef itk::VTKImageToImageFilter< _TLabelImage > TITKImage;
210 typename TITKImage::Pointer itk_image = TITKImage::New( );
211 itk_image->SetInput( this->m_BrushWidget->GetCanvas( ) );
212 itk_image->Update( );
213 filter->SetLabels( itk_image->GetOutput( ) );
219 void ObserveFilter( TFilter* filter )
222 typedef fpa::Image::VisualDebugger2D< TFilter > _TDeb;
223 typedef typename TFilter::TEvent _TEvent;
224 typename _TDeb::Pointer deb = _TDeb::New( );
225 deb->SetVisualization(
226 this->m_Viewer->GetRenderer( ),
227 this->m_Viewer->GetRenderWindow( )->GetInteractor( )
229 this->m_Observer1 = filter->AddObserver( itk::StartEvent( ), deb );
230 this->m_Observer2 = filter->AddObserver( itk::EndEvent( ), deb );
231 this->m_Observer3 = filter->AddObserver( _TEvent( ), deb );
232 filter->VisualDebugOn( );
238 typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
239 typename TVTKInputImage::Pointer m_VTKInputImage;
240 vtkSmartPointer< ivq::VTK::ImageViewer > m_Viewer;
241 vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor > m_SeedWidget;
242 vtkSmartPointer< ivq::VTK::BrushWidget > m_BrushWidget;
243 unsigned long m_Observer1;
244 unsigned long m_Observer2;
245 unsigned long m_Observer3;
252 typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
253 TVTKImage::Pointer vtk_input;
254 vtkSmartPointer< ivq::VTK::ImageViewer > view;
255 vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor > widget;
259 vtk_input = TVTKImage::New( );
260 vtk_input->SetInput( input );
261 vtk_input->Update( );
264 view = vtkSmartPointer< ivq::VTK::ImageViewer >::New( );
265 view->SetInputData( vtk_input->GetOutput( ) );
269 widget = vtkSmartPointer< ivq::VTK::SeedWidgetOverImageActor >::New( );
270 widget->SetActor( view->GetImageActor( ) );
271 widget->SetInteractor( view->GetRenderWindow( )->GetInteractor( ) );
275 view->ResetCamera( );
278 widget->EnabledOn( );
280 widget->EnabledOff( );
282 const ivq::VTK::SeedWidgetOverImageActor::TSeeds& wdg_seeds =
284 ivq::VTK::SeedWidgetOverImageActor::TSeeds::const_iterator wsIt;
285 for( wsIt = wdg_seeds.begin( ); wsIt != wdg_seeds.end( ); ++wsIt )
287 TImage::PointType pnt;
288 for( unsigned int i = 0; i < wsIt->second.size( ); i += 3 )
290 pnt[ 0 ] = wsIt->second[ i ];
291 pnt[ 1 ] = wsIt->second[ i + 1 ];
293 TImage::IndexType idx;
294 input->TransformPhysicalPointToIndex( pnt, idx );
295 seeds.push_back( idx );
313 #endif // __fpa__tests__image__BaseFunctions__h__