]> Creatis software - creaContours.git/commitdiff
Added ITK Segmentation Algorithm
authorcaballero <caballero>
Mon, 30 Mar 2009 12:58:31 +0000 (12:58 +0000)
committercaballero <caballero>
Mon, 30 Mar 2009 12:58:31 +0000 (12:58 +0000)
12 files changed:
appli/wxContourGUIExample/CMakeLists.txt
lib/Interface_Icons_NDimensions/interfMainPanel.cxx
lib/Interface_Icons_NDimensions/interfMainPanel.h
lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx
lib/Interface_Icons_NDimensions/interfSegmentationPanels.h
lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx
lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h
lib/kernel_ManagerContour_NDimensions/CMakeLists.txt
lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.h [new file with mode: 0644]
lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.txx [new file with mode: 0644]
lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.h [new file with mode: 0644]
lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.txx [new file with mode: 0644]

index 3cb63f8387f0e66922a1a5edc678e097eb561ee9..ef609de6b144dcd6eb7bd5d5cd526465c18c1a4f 100644 (file)
@@ -12,6 +12,7 @@ TARGET_LINK_LIBRARIES( wxContourGUIExample
 
 #                     ${WXWIDGETS_LIBRARIES}
                       ${VTK_LIBRARIES}
+                      ${ITK_LIBRARIES}
                       ${creaEnvironment_LIBRARIES}
                       ${creaMaracasVisu_LIBRARIES}
                       ${creaImageIO_LIBRARIES}
index 4c67ae203886dbfcf780602e50833104284b8c1c..518991ae0899dbbbb68f64bdf1265e0614f4ac55 100644 (file)
@@ -473,6 +473,10 @@ void interfMainPanel::onSegmentationOneSlice(int isovalue,int sampling,int metho
        wxContourMainFrame::getInstance()->onSegmentationOneSlice(isovalue, sampling, method);
 }
 
+void interfMainPanel::onSegmentationOneSliceITK(wxString distance, wxString sigma, wxString alfa, wxString beta, wxString propagation, wxString iterations, wxString inflation){
+       wxContourMainFrame::getInstance()->onSegmentationOneSliceITK(distance, sigma, alfa, beta, propagation, iterations, inflation);
+}
+
 int interfMainPanel::GetImageDataSizeZ(){
        return wxContourMainFrame::getInstance()->GetImageDataSizeZ();
 }
@@ -539,8 +543,8 @@ void interfMainPanel::onSegmentationPressedITK(){
                segmentPanelITK->Layout();
        }
        showPanel(segmentPanelITK);
-       //contourevent->showAxis(true);
-       //axisshown = true;
+       wxContourMainFrame::getInstance()->showAxis(true);
+       axisshown = true;
 }
 
 void interfMainPanel::onRigidPressed(){
index bfbeb4fd4ad1dd1b03fba4ac34439f6e24575146..96868371791e73884b5df23d78b729c50090d3a2 100644 (file)
@@ -110,6 +110,8 @@ public:
 
        void onSegmentationOneSlice(int isovalue,int sampling,int method);
 
+       void onSegmentationOneSliceITK(wxString distance, wxString sigma, wxString alfa, wxString beta, wxString propagation, wxString iterations, wxString inflation);
+
        int GetImageDataSizeZ();
 
        void GetImageDataRange(double *range);
index a9cd147d0ccfdc3ee9ca3ea7bc02dd9b524796ea..306370d4af8a886afb2a5c9b38ca86135413d645 100644 (file)
@@ -139,55 +139,38 @@ interfSegmentationPanelITK::interfSegmentationPanelITK(wxWindow * parent)
        double range[2];
        //_theViewPanel->getSceneManager()->GetImageDataRange(range);
        interfMainPanel::getInstance()->GetImageDataRange(range);
+       
+       //The labels
+       wxStaticText * distance = new wxStaticText(this, wxID_ANY, wxT("Initial Distance"), wxPoint(5, 5));
+       wxStaticText * sigma = new wxStaticText(this, wxID_ANY, wxT("Sigma"),wxPoint(5, 30));
+       wxStaticText * alfa = new wxStaticText(this, wxID_ANY, wxT("Sigmoid Alfa"), wxPoint(5, 55));
+       wxStaticText * beta = new wxStaticText(this, wxID_ANY, wxT("Sigmoid Beta"), wxPoint(5, 80));
+       wxStaticText * propagation = new wxStaticText(this, wxID_ANY, wxT("Propagation Scaling"),wxPoint(5, 105));
+       wxStaticText * iterations = new wxStaticText(this, wxID_ANY, wxT("Iterations"), wxPoint(5, 130));
+       wxStaticText * infStrength = new wxStaticText(this, wxID_ANY, wxT("Inflation Strength"), wxPoint(5, 155));
 
-       wxButton *segmentationOneSliceBtn       = new wxButton(this,-1,_T("Current slice"), wxDefaultPosition, wxSize(200,35) );
-       wxButton *segmentationAllSliceBtn       = new wxButton(this,-1,_T("All slices") ,wxDefaultPosition, wxSize(200,35) );
-
-       Connect( segmentationOneSliceBtn->GetId(),   wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfSegmentationPanelITK::onSegmentationOneSlice); 
-       Connect( segmentationAllSliceBtn->GetId(),   wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &interfSegmentationPanelITK::onSegmentationAllSlice); 
-
-       _isovalue                                                       = new wxSlider(this, -1, 40 , (int)(range[0]), (int)(range[1]), wxDefaultPosition, wxSize(200,35), wxSL_HORIZONTAL|wxSL_LABELS, wxDefaultValidator);
-       _sampling                                                       = new wxSlider(this, -1, 20 , 4, 50, wxDefaultPosition, wxSize(200,35), wxSL_HORIZONTAL|wxSL_LABELS, wxDefaultValidator);
-       wxString lstOptions[3];
-       lstOptions[0]=_T("A");
-       lstOptions[1]=_T("B");
-       lstOptions[2]=_T("C");
-       methodRadiobox                                          = new wxRadioBox(this, -1, _T("Method (find ctrl. Points)"), wxDefaultPosition, wxSize(200,45), 3 , lstOptions,  3, wxRA_SPECIFY_COLS);
-       methodRadiobox->SetSelection(2);
-       _staticTextSegmentation                         = new wxStaticText(this,-1,_T("    "));
-
-       _mbarrange                                      =  new mBarRange(this,70, 65);
-       _mbarrange->SetMin(0);
-       _mbarrange->SetStart(0);
+       //Text Controls
 
-       _mbarrange-> SetOrientation( true );
-       _mbarrange-> setActiveStateTo(true);
-       _mbarrange-> setVisibleLabels( true );
-       _mbarrange-> setDeviceEndMargin(10);
-       _mbarrange-> setRepresentedValues( 0 , sizeZ );
-       _mbarrange-> setDeviceBlitStart(10,10); 
-       _mbarrange-> setIfWithActualDrawed( false );
-       _mbarrange-> SetStart( 0 );
-       _mbarrange-> SetEnd( sizeZ );  
+       _distance= new wxTextCtrl(this, wxID_ANY, "5.0", wxPoint(98,5), wxSize(80, 20), 0, wxDefaultValidator, wxTextCtrlNameStr);
 
+       _sigma= new wxTextCtrl(this, wxID_ANY, "1.2", wxPoint(98,30), wxSize(80, 20), 0, wxDefaultValidator, wxTextCtrlNameStr);
 
-       wxFlexGridSizer * sizer                         = new wxFlexGridSizer(1);
-       sizer -> Add( new wxStaticText(this,-1,_T("Isovalue (Gray level)"))  , 1, wxGROW );
-       sizer -> Add( _isovalue , 1, wxGROW );
-       sizer -> Add( methodRadiobox , 1, wxGROW );
-       sizer -> Add( new wxStaticText(this,-1,_T("Sampling (%)"))  , 1, wxGROW );
-       sizer -> Add( _sampling , 1, wxGROW );
-       sizer -> Add( segmentationOneSliceBtn , 1, wxGROW );
-       sizer -> Add( new wxStaticText(this,-1,_T(" "))  , 1, wxGROW );
-       sizer -> Add( _staticTextSegmentation  , 1, wxGROW );
-       sizer -> Add( segmentationAllSliceBtn , 1, wxGROW );
-       sizer -> Add( _mbarrange  , 1, wxGROW );
+       _alfa= new wxTextCtrl(this, wxID_ANY, "-1.0", wxPoint(98,55), wxSize(80, 20), 0, wxDefaultValidator, wxTextCtrlNameStr);
+       
+       _beta= new wxTextCtrl(this, wxID_ANY, "5.0", wxPoint(98,80), wxSize(80, 20), 0, wxDefaultValidator, wxTextCtrlNameStr);
+       
+       _propagation= new wxTextCtrl(this, wxID_ANY, "6.0", wxPoint(98,105), wxSize(80, 20), 0, wxDefaultValidator, wxTextCtrlNameStr);
+       
+       _iterations= new wxTextCtrl(this, wxID_ANY, "800", wxPoint(98,130), wxSize(80, 20), 0, wxDefaultValidator, wxTextCtrlNameStr);
+       
+       _infStrength= new wxTextCtrl(this, wxID_ANY, "3.0", wxPoint(98,155), wxSize(80, 20), 0, wxDefaultValidator, wxTextCtrlNameStr);
+       
+       //El boton
+       wxButton * bot= new wxButton(this, 6, wxT("One Slice"), wxPoint(98, 180), wxSize(70, 25), 0, wxDefaultValidator, "button");
 
-       this->SetSizer( sizer );
-//             panel->SetSize( sizePanel );
-       this->SetSize( wxDefaultSize );
-       this->SetAutoLayout( true );
-       this->Layout();
+       //Conexion del boton con su respectivo manejador
+       Connect(6, wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction) &interfSegmentationPanelITK::onSegmentationOneSlice);
+       
        
 }
 interfSegmentationPanelITK::~interfSegmentationPanelITK(){
@@ -196,12 +179,15 @@ interfSegmentationPanelITK::~interfSegmentationPanelITK(){
 
 void interfSegmentationPanelITK::onSegmentationOneSlice( wxCommandEvent& event )
 {
-
-
-       /*int                           isovalue        = _isovalue->GetValue();
-       int                             sampling        = _sampling->GetValue();
-       int method = methodRadiobox->GetSelection();
-       interfMainPanel::getInstance()->onSegmentationOneSlice(isovalue, sampling, method);*/
+       wxString distanc=_distance->GetValue();
+       wxString sigm=_sigma->GetValue();
+       wxString alf=_alfa->GetValue();
+       wxString bet=_beta->GetValue();
+       wxString prop=_propagation->GetValue();
+       wxString iter=_iterations->GetValue();
+       wxString infS=_infStrength->GetValue();
+       
+       interfMainPanel::getInstance()->onSegmentationOneSliceITK(distanc, sigm, alf, bet, prop, iter, infS);
        
 }
 void interfSegmentationPanelITK::onSegmentationAllSlice( wxCommandEvent& event )
index 605e1b1d44aee0786b3d31b5c28f9fc4da5869fa..bf830aeaae313220c76bebbaaef777dc23c4f278 100644 (file)
@@ -68,15 +68,13 @@ public:
        
 private:
 
-       wxSlider* _isovalue;
-
-       mBarRange* _mbarrange;
-       
-       wxSlider* _sampling;
-
-       wxStaticText* _staticTextSegmentation;
-
-       wxRadioBox* methodRadiobox;
+       wxTextCtrl * _distance;
+       wxTextCtrl * _sigma;
+       wxTextCtrl * _alfa;
+       wxTextCtrl * _beta;
+       wxTextCtrl * _propagation;
+       wxTextCtrl * _iterations;
+       wxTextCtrl * _infStrength;
 };
 
 #endif
index a3aba8df4f7abfb90b94decc93fc664c475cdd58..e81e73084b2cd0225ef3ecb515e20eb8240cd06d 100644 (file)
@@ -915,6 +915,454 @@ vtkImageData* wxContourMainFrame::getImageData(){
        return _theViewPanel->getImageData();
 }
 
+void wxContourMainFrame::onSegmentationOneSliceITK(wxString distance, wxString sigma, wxString alfa, wxString beta, wxString propagation, wxString iterations, wxString inflation)
+{
+       //JCP 20-10-08 Undo redo implementation
+       saveState();
+       //JCP 20-10-08 Undo redo implementation
+       
+       wxBusyCursor wait;
+       int                                     x                                       = _theViewPanel->GetX();
+       int                                     y                                       = _theViewPanel->GetY();
+       int                                     z                                       = _theViewPanel->GetZ();
+       SegmentationOneSliceITK( x,y,z,distance, sigma, alfa, beta, propagation, iterations, inflation);
+       RefreshInterface();
+}
+
+void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString distanc, wxString sigm, wxString alf, wxString bet, wxString prop, wxString iter, wxString inflation)
+{
+       
+       int typeofcontour = 1;
+       //Image Data
+       vtkImageData    *imagedata      = getImageData();
+       
+       //Tipo de pixeles a utilizar internamente en ITK
+  typedef   float  InternalPixelType;
+  const     unsigned int    Dimension = 2;
+  typedef itk::Image< InternalPixelType, Dimension >  InternalImageType;
+
+  //Tipo de pixeles de salida 1
+  typedef unsigned char OutputPixelType;
+  typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
+
+  //Tipo de pixeles de salida 2
+  typedef unsigned short OutputPixelType2;
+  typedef itk::Image< OutputPixelType2, Dimension > OutputImageType2;
+
+  //Definición del thresholder
+  typedef itk::BinaryThresholdImageFilter< 
+                        InternalImageType, 
+                        OutputImageType    >    ThresholdingFilterType;
+  
+  //Definición del primer filtro de conversión de pixeles
+  typedef itk::CastImageFilter<
+               OutputImageType, OutputImageType2 >  CastFilterType;
+
+  //Definición del segundo tipo de conversión de pixeles
+  typedef itk::CastImageFilter<
+               OutputImageType2, InternalImageType >  CastFilterType2;
+
+  //Tercer tipo de conversión
+  typedef itk::RescaleIntensityImageFilter< 
+                               InternalImageType, 
+                               OutputImageType >   CastFilterType3;
+
+  //Cuarto tipo de conversión
+  typedef itk::RescaleIntensityImageFilter< 
+                               OutputImageType, 
+                               OutputImageType >   CastFilterType4;
+
+  ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
+                        
+  thresholder->SetLowerThreshold( 0.0 );
+  thresholder->SetUpperThreshold( 128 );
+
+  thresholder->SetOutsideValue(  255  );
+  thresholder->SetInsideValue(  0 );
+
+  //Definción de conexiónes entre VTK e ITK y el writer
+  typedef itk::VTKImageToImageFilter<OutputImageType2> ConnectorType;
+  typedef itk::ImageToVTKImageFilter<OutputImageType> ConnectorType2;
+  typedef  itk::ImageFileWriter<  OutputImageType  > WriterType;
+
+  ConnectorType::Pointer connector= ConnectorType::New();
+  ConnectorType2::Pointer connector2= ConnectorType2::New();
+  
+
+  CastFilterType::Pointer filter=CastFilterType::New();
+  CastFilterType2::Pointer filter2=CastFilterType2::New();
+
+  connector->SetInput( imagedata );
+  filter2->SetInput(connector->GetOutput());
+
+  typedef   itk::CurvatureAnisotropicDiffusionImageFilter< 
+                               InternalImageType, 
+                               InternalImageType >  SmoothingFilterType;
+
+  SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();
+
+  typedef   itk::GradientMagnitudeRecursiveGaussianImageFilter< 
+                               InternalImageType, 
+                               InternalImageType >  GradientFilterType;
+
+  typedef   itk::SigmoidImageFilter<                               
+                               InternalImageType, 
+                               InternalImageType >  SigmoidFilterType;
+
+  GradientFilterType::Pointer  gradientMagnitude = GradientFilterType::New();
+
+  SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
+
+  sigmoid->SetOutputMinimum(  0.0  );
+  sigmoid->SetOutputMaximum(  255.0  );
+
+
+  typedef  itk::FastMarchingImageFilter< 
+                              InternalImageType, 
+                              InternalImageType >    FastMarchingFilterType;
+
+
+  FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
+
+  typedef  itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType, 
+                InternalImageType >    GeodesicActiveContourFilterType;
+  GeodesicActiveContourFilterType::Pointer geodesicActiveContour = 
+                                     GeodesicActiveContourFilterType::New();
+
+  typedef  itk::ZeroCrossingImageFilter< 
+                              InternalImageType, 
+                              InternalImageType >    ZeroCrossingFilterType;
+ZeroCrossingFilterType::Pointer zeroCrossing =
+                                                                       ZeroCrossingFilterType::New();
+
+const double propagationScaling = atof( prop );
+
+  geodesicActiveContour->SetPropagationScaling( propagationScaling );
+  geodesicActiveContour->SetCurvatureScaling( 1.0 );
+  geodesicActiveContour->SetAdvectionScaling( 1.0 );
+
+  geodesicActiveContour->SetMaximumRMSError( 0.02 );
+  int it=atoi( iter );
+  geodesicActiveContour->SetNumberOfIterations( it );
+
+  smoothing->SetInput( filter2->GetOutput() );
+  gradientMagnitude->SetInput( smoothing->GetOutput() );
+  sigmoid->SetInput( gradientMagnitude->GetOutput() );
+  fastMarching->SetInput( sigmoid->GetOutput() );
+  geodesicActiveContour->SetInput(  fastMarching->GetOutput() );
+  geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() );
+  
+  zeroCrossing->SetInput( geodesicActiveContour->GetOutput() );
+  //thresholder->SetInput( zeroCrossing->GetOutput() );
+  thresholder->SetInput( geodesicActiveContour->GetOutput() );
+  connector2->SetInput( thresholder->GetOutput()  );
+  
+
+  smoothing->SetTimeStep( 0.125 );
+  smoothing->SetNumberOfIterations(  5 );
+  smoothing->SetConductanceParameter( 9.0 );
+
+
+  const double sigma = atof( sigm );
+  gradientMagnitude->SetSigma(  sigma  );
+
+  const double alpha =  atof( alf );
+  const double beta  =  atof( bet );
+
+  sigmoid->SetAlpha( alpha );
+  sigmoid->SetBeta(  beta  );
+  
+  typedef FastMarchingFilterType::NodeContainer  NodeContainer;
+  typedef FastMarchingFilterType::NodeType       NodeType;
+
+  NodeContainer::Pointer seeds = NodeContainer::New();
+
+  InternalImageType::IndexType  seedPosition;
+  seedPosition[0] = x;
+  seedPosition[1] = y;
+
+  const double initialDistance = atof( distanc );
+
+  NodeType node;
+
+  const double seedValue = - initialDistance;
+
+  node.SetValue( seedValue );
+  node.SetIndex( seedPosition );
+       
+  seeds->Initialize();
+  seeds->InsertElement( 0, node );
+
+  fastMarching->SetTrialPoints(  seeds  );
+
+  fastMarching->SetSpeedConstant( 1.0 );
+  
+  fastMarching->SetOutputSize( 
+           connector->GetOutput()->GetBufferedRegion().GetSize() );
+  
+  fastMarching->SetStoppingValue( 800 );
+  try
+    {
+               
+       connector2->Update();
+       vtkImageData *idata = connector2->GetOutput();
+
+       vtkMarchingContourFilter* cntVTK = vtkMarchingContourFilter::New( );
+       
+       cntVTK->SetInput( idata );
+       
+       cntVTK->SetNumberOfContours( 1 );
+       cntVTK->SetValue( 0, 255 );
+       cntVTK->Update( );
+       cntVTK->UpdateInformation();
+               
+       vtkCleanPolyData* cpd = vtkCleanPolyData::New( );
+       cpd->SetInput( cntVTK->GetOutput( ) );
+       cpd->Update( );
+       cpd->UpdateInformation();
+
+       vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( );
+       conn->SetExtractionModeToLargestRegion( );
+       conn->SetInput( cpd->GetOutput( ) );
+       conn->Update( );
+       conn->UpdateInformation();
+
+       vtkStripper* vtkstripper = vtkStripper::New( );
+       vtkstripper->SetInput( conn->GetOutput() );
+       vtkstripper->Update();
+       vtkstripper->UpdateInformation();
+
+
+       vtkPolyData* polyDataResult =  cntVTK->GetOutput();
+       std::cout<<"Points "<<polyDataResult->GetNumberOfPoints()<<std::endl;
+       polyDataResult->Update( );
+       polyDataResult->UpdateInformation();
+
+//EED
+       /*
+ofstream myfile;
+myfile.open ("C:/Creatis/example.txt");
+myfile << "\n";
+polyDataResult->Print(myfile);
+myfile << "-------------------------------------\n";
+polyDataResult->GetLines()->Print(myfile);
+myfile.close();*/
+
+       cntVTK          -> Delete();
+       cpd                     -> Delete();
+       conn            -> Delete();
+
+
+//--Calculating control points
+
+       std::vector<double> vecX;
+       std::vector<double> vecY;
+       std::vector<double> vecXo;
+       std::vector<double> vecYo;
+       std::vector<double>::iterator vecXoi;
+       std::vector<double>::iterator vecYoi;
+       std::vector<double> vecZ;
+
+       std::vector<double> vecCtrlPointX;
+       std::vector<double> vecCtrlPointY;
+       std::vector<double> vecCtrlPointZ;
+
+
+       double *p;
+       double xAct=0;
+       double yAct=0;
+       int ii,size=polyDataResult->GetNumberOfPoints();
+ofstream myfile;
+myfile.open ("C:/Creatis/example2.txt");
+
+       size=polyDataResult->GetNumberOfPoints();
+       for (ii=0;ii<size;ii++)
+       {
+               if(ii==0)
+               {
+                       xAct=x;
+                       yAct=y;
+               }
+               p       = polyDataResult->GetPoint(ii);
+               double x=p[0];
+               double y=p[1];
+               /*if(fabs(yAct-y)>20)
+               {
+                       if((xAct-x)>1 || (xAct-x)<-1)
+                       {
+                       vecX.push_back( p[0] );
+                       vecY.push_back( p[1] );
+                       myfile <<p[0]<<","<<p[1]<<"\n";
+                       std::cout<<" x Anterior "<<xAct<<" x actual "<<x<<std::endl;
+               std::cout<<" y Anterior "<<yAct<<" y actual "<<y<<std::endl;
+               std::cout<<" x "<<p[0]<<" y "<<p[1]<<std::endl;
+                       vecZ.push_back( -900 );
+                       xAct=x;
+                       yAct=y;
+                       }
+                       else
+                       {
+                               vecXo.push_back(p[0]);
+                               vecYo.push_back(p[1]);
+                       }
+                       
+               }
+               else*/ if(fabs(xAct-x)>11)
+               {
+                       vecXo.push_back(p[0]);
+                       vecYo.push_back(p[1]);
+               }
+               else
+               {
+               vecX.push_back( p[0] );
+               myfile <<p[0]<<","<<p[1]<<"\n";
+               std::cout<<" x Anterior "<<xAct<<" x actual "<<x<<std::endl;
+               std::cout<<" y Anterior "<<yAct<<" y actual "<<y<<std::endl;
+               std::cout<<" x "<<p[0]<<" y "<<p[1]<<std::endl;
+               vecY.push_back( p[1] );
+               vecZ.push_back( -900 );
+               xAct=x;
+               yAct=y;
+               }
+               
+               
+       }
+
+       while(!vecXo.empty())
+       {
+               vecX.push_back(vecXo.back());
+               std::cout<<" x Siguiente "<<vecXo.back();
+               vecXo.pop_back();
+               vecZ.push_back( -900 );
+       }
+       while(!vecYo.empty())
+       {
+               vecY.push_back(vecYo.back());
+                       vecYo.pop_back();
+       }
+       myfile.close();
+
+       /*for(int l=0;l<vecX.size();l++)
+       {
+               if(l==0)
+               {
+            vecXo.push_back(p[0]);
+                       vecYo.push_back(p[1]);
+               }
+               else
+               {
+                       if(vecXoi[l-1]==)
+                       {
+                       }
+               }
+
+       }*/
+
+       ExtractControlPoints2D *extractcontrolpoints2d = new ExtractControlPoints2D();
+
+       extractcontrolpoints2d->SetContour( &vecX , &vecY , &vecZ );
+       
+int method=2;
+       if (method==0){
+               extractcontrolpoints2d->GetInitialControlPoints( &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
+       }
+       else if (method==1){
+               extractcontrolpoints2d->GetControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
+       }
+       else if (method==2){
+               extractcontrolpoints2d->SetSamplingControlPoints( 15 );
+               extractcontrolpoints2d->GetSamplingControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
+       }
+       //--Adding contour to the system
+
+       std::vector<int> actualInstantVector;
+       _instantPanel->getInstant( actualInstantVector );
+       actualInstantVector[1]=z;
+
+       int j,sizeCtrPt = vecCtrlPointX.size();
+       
+       manualContourModel *manModelContour =  kernelManager->factoryManualContourModel( typeofcontour );
+       manModelContour->SetNumberOfPointsSpline( ((sizeCtrPt/100)+1)*100 );
+       if (sizeCtrPt>=3){
+               for (j=0 ; j<sizeCtrPt ; j++)
+               {
+                       manModelContour->AddPoint( vecCtrlPointX[j] , vecCtrlPointY[j] , vecCtrlPointZ[j]  );
+               } // for
+               std::string theName;
+               //theName = _modelManager->createOutline( manModelContour, actualInstantVector );
+               theName = kernelManager->createOutline( manModelContour, actualInstantVector );
+               bool addedModel = theName.compare("") != 0;
+               if( addedModel )
+               {
+                       double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
+                       _theViewPanel->getSpacing(spc); 
+                       //Adding the manualContourControler to interface objects structure
+                       //Adding the manualViewContour to interface objects structure           
+                       //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
+                       _theViewPanel->configureViewControlTo(theName, manModelContour, spc, typeofcontour);
+                       //_theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc, typeofcontour ) ;
+               }       // if addedModel
+       } // if sizeCtrPt
+
+               
+                
+                WriterType::Pointer writer = WriterType::New();
+         CastFilterType3::Pointer caster = CastFilterType3::New();
+                
+                caster->SetInput( gradientMagnitude->GetOutput() );
+                writer->SetInput( caster->GetOutput() );
+                writer->SetFileName("Gradient Magnitude.png");
+                caster->SetOutputMinimum(   0 );
+                caster->SetOutputMaximum( 255 );
+                writer->Update();
+               
+                CastFilterType3::Pointer caster2 = CastFilterType3::New();
+                WriterType::Pointer writer2 = WriterType::New();
+
+                caster2->SetInput( sigmoid->GetOutput() );
+                writer2->SetInput( caster2->GetOutput() );
+                writer2->SetFileName("Sigmoid.png");
+                caster2->SetOutputMinimum(   0 );
+                caster2->SetOutputMaximum( 255 );
+                writer2->Update();
+
+                CastFilterType3::Pointer caster3 = CastFilterType3::New();
+                WriterType::Pointer writer3 = WriterType::New();
+
+                caster3->SetInput( fastMarching->GetOutput() );
+                writer3->SetInput( caster3->GetOutput() );
+                writer3->SetFileName("FastMarching.bmp");
+                caster3->SetOutputMinimum(   0 );
+                caster3->SetOutputMaximum( 255 );
+                writer3->Update();
+
+                CastFilterType3::Pointer caster4 = CastFilterType3::New();
+                WriterType::Pointer writer4 = WriterType::New();
+
+                caster4->SetInput( geodesicActiveContour->GetOutput() );
+                writer4->SetInput( caster4->GetOutput() );
+                writer4->SetFileName("GeodesicActiveContour.png");
+                caster4->SetOutputMinimum(   0 );
+                caster4->SetOutputMaximum( 255 );
+                writer4->Update();
+
+                CastFilterType3::Pointer caster5 = CastFilterType3::New();
+                WriterType::Pointer writer5 = WriterType::New();
+
+                caster5->SetInput( zeroCrossing->GetOutput() );
+                writer5->SetInput( caster5->GetOutput() );
+                writer5->SetFileName("ZeroCrossing.bmp");
+                caster5->SetOutputMinimum(   0 );
+                caster5->SetOutputMaximum( 255 );
+                writer5->Update();
+    }
+  catch( itk::ExceptionObject & excep )
+    {
+    std::cerr << "Exception caught !" << std::endl;
+    std::cerr << excep << std::endl;
+    }
+}
+
 void wxContourMainFrame::onSegmentationOneSlice(int isovalue,int sampling,int method){
        
        //JCP 20-10-08 Undo redo implementation
index 9ceabd9edfc924a901982c63b310c928bfc4e168..b48f08a17e482b05d5fc7a2876045df3d6ddf4e6 100644 (file)
 //#include "wxContour_ListViewPanel.h"
 
 
-
-
+//ITK
+#include "itkImage.h"
+#include "itkGeodesicActiveContourLevelSetImageFilter.h"
+
+#include "itkCurvatureAnisotropicDiffusionImageFilter.h"
+#include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"
+#include "itkSigmoidImageFilter.h"
+#include "itkFastMarchingImageFilter.h"
+#include "itkRescaleIntensityImageFilter.h"
+#include "itkBinaryThresholdImageFilter.h"
+#include "itkZeroCrossingImageFilter.h"
+#include "itkCastImageFilter.h"
+
+#include "itkImageFileWriter.h"
+
+#include "itkImageToVTKImageFilter.h"
+#include "itkVTKImageToImageFilter.h"
+
+//VTK
+#include <vtkImageSeedConnectivity.h>
+#include <vtkImageMarchingCubes.h>
 #include "vtkContourFilter.h"
+#include "vtkMarchingContourFilter.h"
 #include "vtkPolyDataConnectivityFilter.h"
 #include "vtkCleanPolyData.h"
 #include "vtkImageReslice.h"
@@ -215,8 +235,12 @@ class wxContourMainFrame : public wxPanel {
 
        void onSegmentationOneSlice(int isovalue,int sampling,int method);
 
+       void onSegmentationOneSliceITK(wxString distance, wxString sigma, wxString alfa, wxString beta, wxString propagation, wxString iterations, wxString inflation);
+
        void SegmentationOneSlice( int x, int y, int z, int isovalue, int sampling, int method );
 
+       void SegmentationOneSliceITK(int x, int y, int z, wxString distance, wxString sigma, wxString alfa, wxString beta, wxString propagation, wxString iterations, wxString inflation);
+
        void Mirror( int x, int y, int z, int isovalue, int sampling, int method );
 
        int GetImageDataSizeZ();
index 591a67ba207a66e370926480bfe0e574fc4dc231..04b1bc3f8fda3a9123e3a889918ad2bd69d9c3e1 100644 (file)
@@ -29,7 +29,7 @@ IF ( BUILD_${LIBRARY_NAME} )
   #----------------------------------------------------------------------------
   # LIBRARY SOURCES (TO BE COMPILED)
   # EITHER LIST ALL .cxx, *.cpp, *.cc IN CURRENT DIR USING NEXT LINE:
-  FILE(GLOB ${LIBRARY_NAME}_SOURCES *.cxx *.cpp *.cc *.h)
+  FILE(GLOB ${LIBRARY_NAME}_SOURCES *.cxx *.cpp *.cc *.h *.txx)
   # OR MANUALLY LIST YOUR FILES WITH NEXT COMMAND (WITHOUT EXTENSION)
   #  SET ( ${LIBRARY_NAME}_SOURCES 
   #   
diff --git a/lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.h b/lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.h
new file mode 100644 (file)
index 0000000..b3a4df8
--- /dev/null
@@ -0,0 +1,103 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkImageToVTKImageFilter.h,v $
+  Language:  C++
+  Date:      $Date: 2009/03/30 12:58:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __itkImageToVTKImageFilter_h
+#define __itkImageToVTKImageFilter_h
+
+#include "itkVTKImageExport.h"
+#include "vtkImageImport.h"
+#include "vtkImageData.h"
+
+namespace itk
+{
+  
+/** \class ImageToVTKImageFilter
+ * \brief Converts an ITK image into a VTK image and plugs a 
+ *  itk data pipeline to a VTK datapipeline.   
+ *
+ *  This class puts together an itkVTKImageExporter and a vtkImageImporter.
+ *  It takes care of the details related to the connection of ITK and VTK
+ *  pipelines. The User will perceive this filter as an adaptor to which
+ *  an itk::Image can be plugged as input and a vtkImage is produced as 
+ *  output.
+ * 
+ * \ingroup   ImageFilters     
+ */
+template <class TInputImage >
+class ITK_EXPORT ImageToVTKImageFilter : public ProcessObject
+{
+public:
+  /** Standard class typedefs. */
+  typedef ImageToVTKImageFilter       Self;
+  typedef ProcessObject             Superclass;
+  typedef SmartPointer<Self>        Pointer;
+  typedef SmartPointer<const Self>  ConstPointer;
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(ImageToVTKImageFilter, ProcessObject);
+
+  /** Some typedefs. */
+  typedef TInputImage InputImageType;
+  typedef typename    InputImageType::ConstPointer    InputImagePointer;
+  typedef VTKImageExport< InputImageType>            ExporterFilterType; 
+  typedef typename ExporterFilterType::Pointer        ExporterFilterPointer;
+  /** Get the output in the form of a vtkImage. 
+      This call is delegated to the internal vtkImageImporter filter  */
+  vtkImageData *  GetOutput() const;
+
+  /** Set the input in the form of an itk::Image */
+  void SetInput( const InputImageType * );
+
+  /** Return the internal VTK image importer filter.
+      This is intended to facilitate users the access 
+      to methods in the importer */
+  vtkImageImport * GetImporter() const;
+
+  /** Return the internal ITK image exporter filter.
+      This is intended to facilitate users the access 
+      to methods in the exporter */
+  ExporterFilterType * GetExporter() const;
+  
+  /** This call delegate the update to the importer */
+  void Update();
+  
+protected:
+  ImageToVTKImageFilter(); 
+  virtual ~ImageToVTKImageFilter(); 
+
+private:
+  ImageToVTKImageFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  ExporterFilterPointer       m_Exporter;
+  vtkImageImport            * m_Importer;
+
+};
+
+} // end namespace itk
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "itkImageToVTKImageFilter.txx"
+#endif
+
+#endif
+
+
+
diff --git a/lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.txx b/lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.txx
new file mode 100644 (file)
index 0000000..4dd66f9
--- /dev/null
@@ -0,0 +1,144 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkImageToVTKImageFilter.txx,v $
+  Language:  C++
+  Date:      $Date: 2009/03/30 12:58:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef _itkImageToVTKImageFilter_txx
+#define _itkImageToVTKImageFilter_txx
+
+#include "itkImageToVTKImageFilter.h"
+
+namespace itk
+{
+
+
+
+/**
+ * Constructor
+ */
+template <class TInputImage>
+ImageToVTKImageFilter<TInputImage>
+::ImageToVTKImageFilter()
+{
+
+  m_Importer = vtkImageImport::New();
+
+  m_Exporter = ExporterFilterType::New();
+
+  m_Importer->SetUpdateInformationCallback(m_Exporter->GetUpdateInformationCallback());
+  m_Importer->SetPipelineModifiedCallback(m_Exporter->GetPipelineModifiedCallback());
+  m_Importer->SetWholeExtentCallback(m_Exporter->GetWholeExtentCallback());
+  m_Importer->SetSpacingCallback(m_Exporter->GetSpacingCallback());
+  m_Importer->SetOriginCallback(m_Exporter->GetOriginCallback());
+  m_Importer->SetScalarTypeCallback(m_Exporter->GetScalarTypeCallback());
+  m_Importer->SetNumberOfComponentsCallback(m_Exporter->GetNumberOfComponentsCallback());
+  m_Importer->SetPropagateUpdateExtentCallback(m_Exporter->GetPropagateUpdateExtentCallback());
+  m_Importer->SetUpdateDataCallback(m_Exporter->GetUpdateDataCallback());
+  m_Importer->SetDataExtentCallback(m_Exporter->GetDataExtentCallback());
+  m_Importer->SetBufferPointerCallback(m_Exporter->GetBufferPointerCallback());
+  m_Importer->SetCallbackUserData(m_Exporter->GetCallbackUserData());
+
+}
+
+
+
+
+/**
+ * Destructor
+ */
+template <class TInputImage>
+ImageToVTKImageFilter<TInputImage>
+::~ImageToVTKImageFilter()
+{
+  if( m_Importer )
+    {
+    m_Importer->Delete();
+    m_Importer = 0;
+    }
+}
+
+
+
+/**
+ * Set an itk::Image as input 
+ */
+template <class TInputImage>
+void
+ImageToVTKImageFilter<TInputImage>
+::SetInput( const InputImageType * inputImage )
+{
+  m_Exporter->SetInput( inputImage );
+}
+
+
+
+/**
+ * Get a vtkImage as output
+ */
+template <class TInputImage>
+vtkImageData *
+ImageToVTKImageFilter<TInputImage>
+::GetOutput() const
+{
+  return m_Importer->GetOutput();
+}
+
+
+
+
+/**
+ * Get the importer filter
+ */
+template <class TInputImage>
+vtkImageImport *
+ImageToVTKImageFilter<TInputImage>
+::GetImporter() const
+{
+  return m_Importer;
+}
+
+
+
+/**
+ * Get the exporter filter
+ */
+template <class TInputImage>
+typename ImageToVTKImageFilter<TInputImage>::ExporterFilterType *
+ImageToVTKImageFilter<TInputImage>
+::GetExporter() const
+{
+  return m_Exporter.GetPointer();
+}
+
+
+
+/**
+ * Delegate the Update to the importer
+ */
+template <class TInputImage>
+void
+ImageToVTKImageFilter<TInputImage>
+::Update()
+{
+  m_Importer->Update();
+}
+
+
+
+
+
+} // end namespace itk
+
+#endif
+
diff --git a/lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.h b/lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.h
new file mode 100644 (file)
index 0000000..4a343c6
--- /dev/null
@@ -0,0 +1,107 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkVTKImageToImageFilter.h,v $
+  Language:  C++
+  Date:      $Date: 2009/03/30 12:58:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __itkVTKImageToImageFilter_h
+#define __itkVTKImageToImageFilter_h
+
+#include "itkVTKImageImport.h"
+#include "vtkImageExport.h"
+#include "vtkImageData.h"
+
+#ifndef vtkFloatingPointType
+#define vtkFloatingPointType float
+#endif
+
+namespace itk
+{
+  
+/** \class VTKImageToImageFilter
+ * \brief Converts a VTK image into an ITK image and plugs a 
+ *  vtk data pipeline to an ITK datapipeline.   
+ *
+ *  This class puts together an itkVTKImageImporter and a vtkImageExporter.
+ *  It takes care of the details related to the connection of ITK and VTK
+ *  pipelines. The User will perceive this filter as an adaptor to which
+ *  a vtkImage can be plugged as input and an itk::Image is produced as 
+ *  output.
+ * 
+ * \ingroup   ImageFilters     
+ */
+template <class TOutputImage >
+class ITK_EXPORT VTKImageToImageFilter : public ProcessObject
+{
+public:
+  /** Standard class typedefs. */
+  typedef VTKImageToImageFilter       Self;
+  typedef ProcessObject             Superclass;
+  typedef SmartPointer<Self>        Pointer;
+  typedef SmartPointer<const Self>  ConstPointer;
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+  
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(VTKImageToImageFilter, ProcessObject);
+
+  /** Some typedefs. */
+  typedef TOutputImage OutputImageType;
+  typedef typename    OutputImageType::ConstPointer    OutputImagePointer;
+  typedef VTKImageImport< OutputImageType >   ImporterFilterType; 
+  typedef typename ImporterFilterType::Pointer         ImporterFilterPointer;
+  /** Get the output in the form of a vtkImage. 
+      This call is delegated to the internal vtkImageImporter filter  */
+  const OutputImageType *  GetOutput() const;
+
+  /** Set the input in the form of a vtkImageData */
+  void SetInput( vtkImageData * );
+
+  /** Return the internal VTK image exporter filter.
+      This is intended to facilitate users the access 
+      to methods in the exporter */
+  vtkImageExport * GetExporter() const;
+
+  /** Return the internal ITK image importer filter.
+      This is intended to facilitate users the access 
+      to methods in the importer */
+  ImporterFilterType * GetImporter() const;
+  
+  /** This call delegate the update to the importer */
+  void Update();
+  
+protected:
+  VTKImageToImageFilter(); 
+  virtual ~VTKImageToImageFilter(); 
+
+private:
+  VTKImageToImageFilter(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  ImporterFilterPointer       m_Importer;
+  vtkImageExport            * m_Exporter;
+
+};
+
+} // end namespace itk
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "itkVTKImageToImageFilter.txx"
+#endif
+
+#endif
+
+
+
diff --git a/lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.txx b/lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.txx
new file mode 100644 (file)
index 0000000..cf86a84
--- /dev/null
@@ -0,0 +1,144 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile: itkVTKImageToImageFilter.txx,v $
+  Language:  C++
+  Date:      $Date: 2009/03/30 12:58:41 $
+  Version:   $Revision: 1.1 $
+
+  Copyright (c) 2002 Insight Consortium. All rights reserved.
+  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef _itkVTKImageToImageFilter_txx
+#define _itkVTKImageToImageFilter_txx
+
+#include "itkVTKImageToImageFilter.h"
+
+namespace itk
+{
+
+
+
+/**
+ * Constructor
+ */
+template <class TOutputImage>
+VTKImageToImageFilter<TOutputImage>
+::VTKImageToImageFilter()
+{
+
+  m_Exporter = vtkImageExport::New();
+
+  m_Importer = ImporterFilterType::New();
+
+  m_Importer->SetUpdateInformationCallback( m_Exporter->GetUpdateInformationCallback());
+  m_Importer->SetPipelineModifiedCallback( m_Exporter->GetPipelineModifiedCallback());
+  m_Importer->SetWholeExtentCallback( m_Exporter->GetWholeExtentCallback());
+  m_Importer->SetSpacingCallback( m_Exporter->GetSpacingCallback());
+  m_Importer->SetOriginCallback( m_Exporter->GetOriginCallback());
+  m_Importer->SetScalarTypeCallback( m_Exporter->GetScalarTypeCallback());
+  m_Importer->SetNumberOfComponentsCallback( m_Exporter->GetNumberOfComponentsCallback());
+  m_Importer->SetPropagateUpdateExtentCallback( m_Exporter->GetPropagateUpdateExtentCallback());
+  m_Importer->SetUpdateDataCallback( m_Exporter->GetUpdateDataCallback());
+  m_Importer->SetDataExtentCallback( m_Exporter->GetDataExtentCallback());
+  m_Importer->SetBufferPointerCallback( m_Exporter->GetBufferPointerCallback());
+  m_Importer->SetCallbackUserData( m_Exporter->GetCallbackUserData());
+
+}
+
+
+
+
+/**
+ * Destructor
+ */
+template <class TOutputImage>
+VTKImageToImageFilter<TOutputImage>
+::~VTKImageToImageFilter()
+{
+  if( m_Exporter )
+    {
+    m_Exporter->Delete();
+    m_Exporter = 0;
+    }
+}
+
+
+
+/**
+ * Set a vtkImageData as input 
+ */
+template <class TOutputImage>
+void
+VTKImageToImageFilter<TOutputImage>
+::SetInput( vtkImageData * inputImage )
+{
+  m_Exporter->SetInput( inputImage );
+}
+
+
+
+/**
+ * Get an itk::Image as output
+ */
+template <class TOutputImage>
+const typename VTKImageToImageFilter<TOutputImage>::OutputImageType *
+VTKImageToImageFilter<TOutputImage>
+::GetOutput() const
+{
+  return m_Importer->GetOutput();
+}
+
+
+
+
+/**
+ * Get the exporter filter
+ */
+template <class TOutputImage>
+vtkImageExport *
+VTKImageToImageFilter<TOutputImage>
+::GetExporter() const
+{
+  return m_Exporter;
+}
+
+
+
+/**
+ * Get the importer filter
+ */
+template <class TOutputImage>
+typename VTKImageToImageFilter<TOutputImage>::ImporterFilterType *
+VTKImageToImageFilter<TOutputImage>
+::GetImporter() const
+{
+  return m_Importer;
+}
+
+
+
+
+/**
+ * Delegate the Update to the importer
+ */
+template <class TOutputImage>
+void
+VTKImageToImageFilter<TOutputImage>
+::Update()
+{
+  m_Importer->Update();
+}
+
+
+
+
+} // end namespace itk
+
+#endif
+