1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #include <ivq/VTK/ImageToFourierSeriesFilter.h>
7 #include <ivq/VTK/PolyDataToFourierSeriesFilter.h>
8 #include <vtkImageData.h>
9 #include <vtkInformation.h>
10 #include <vtkInformationVector.h>
11 #include <vtkMarchingSquares.h>
12 #include <vtkPolyDataConnectivityFilter.h>
13 #include <vtkSmartPointer.h>
15 // -------------------------------------------------------------------------
16 template< class _TFourierSeries >
17 typename ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
18 Self* ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
21 return( new Self( ) );
24 // -------------------------------------------------------------------------
25 template< class _TFourierSeries >
26 const _TFourierSeries&
27 ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
30 return( this->m_FourierSeries );
33 // -------------------------------------------------------------------------
34 template< class _TFourierSeries >
35 void ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
36 SetNumberOfHarmonics( unsigned int q )
38 if( this->m_FourierSeries.GetNumberOfHarmonics( ) != q )
40 this->m_FourierSeries.SetNumberOfHarmonics( q );
46 // -------------------------------------------------------------------------
47 template< class _TFourierSeries >
48 unsigned int ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
49 GetNumberOfHarmonics( ) const
51 return( this->m_FourierSeries.GetNumberOfHarmonics( ) );
54 // -------------------------------------------------------------------------
55 template< class _TFourierSeries >
56 const double& ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
57 GetContourValue( ) const
59 return( this->m_ContourValue );
62 // -------------------------------------------------------------------------
63 template< class _TFourierSeries >
64 void ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
65 SetContourValue( const double& v )
67 if( this->m_ContourValue != v )
69 this->m_ContourValue = v;
75 // -------------------------------------------------------------------------
76 template< class _TFourierSeries >
77 ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
78 ImageToFourierSeriesFilter( )
79 : vtkImageAlgorithm( ),
80 m_ContourValue( double( 0 ) )
82 this->SetNumberOfInputPorts( 1 );
83 this->SetNumberOfOutputPorts( 0 );
84 this->m_FourierSeries.SetNumberOfHarmonics( 1 );
87 // -------------------------------------------------------------------------
88 template< class _TFourierSeries >
89 ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
90 ~ImageToFourierSeriesFilter( )
94 // -------------------------------------------------------------------------
95 template< class _TFourierSeries >
96 int ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
98 vtkInformation* information,
99 vtkInformationVector** input,
100 vtkInformationVector* output
103 // Get input polydata
104 vtkInformation* inInfo = input[ 0 ]->GetInformationObject( 0 );
105 vtkImageData* image =
106 vtkImageData::SafeDownCast(
107 inInfo->Get( vtkDataObject::DATA_OBJECT( ) )
111 vtkSmartPointer< vtkMarchingSquares > ms =
112 vtkSmartPointer< vtkMarchingSquares >::New( );
113 ms->SetInputData( image );
114 ms->SetValue( 0, this->m_ContourValue );
116 vtkSmartPointer< vtkPolyDataConnectivityFilter > conn =
117 vtkSmartPointer< vtkPolyDataConnectivityFilter >::New( );
118 conn->SetInputConnection( ms->GetOutputPort( ) );
119 conn->SetExtractionModeToClosestPointRegion( );
120 conn->SetClosestPoint( 0, 0, 0 );
122 // Compute fourier series
123 typedef ivq::VTK::PolyDataToFourierSeriesFilter< TFourierSeries > _TFilter;
124 vtkSmartPointer< _TFilter > filter = vtkSmartPointer< _TFilter >::New( );
125 filter->SetInputConnection( conn->GetOutputPort( ) );
126 filter->SetNumberOfHarmonics( this->m_FourierSeries.GetNumberOfHarmonics( ) );
128 this->m_FourierSeries = filter->GetOutput( );
133 // -------------------------------------------------------------------------
134 template< class _TFourierSeries >
135 int ivq::VTK::ImageToFourierSeriesFilter< _TFourierSeries >::
137 vtkInformation* information,
138 vtkInformationVector** input,
139 vtkInformationVector* output
145 // -------------------------------------------------------------------------
146 #include <ivq/ITK/FourierSeries.h>
148 template class IVQ_EXPORT ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< float, 2 > >;
149 template class IVQ_EXPORT ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< float, 3 > >;
150 template class IVQ_EXPORT ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< double, 2 > >;
151 template class IVQ_EXPORT ivq::VTK::ImageToFourierSeriesFilter< ivq::ITK::FourierSeries< double, 3 > >;