# ${WXWIDGETS_LIBRARIES}
${VTK_LIBRARIES}
+ ${ITK_LIBRARIES}
${creaEnvironment_LIBRARIES}
${creaMaracasVisu_LIBRARIES}
${creaImageIO_LIBRARIES}
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();
}
segmentPanelITK->Layout();
}
showPanel(segmentPanelITK);
- //contourevent->showAxis(true);
- //axisshown = true;
+ wxContourMainFrame::getInstance()->showAxis(true);
+ axisshown = true;
}
void interfMainPanel::onRigidPressed(){
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);
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(){
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 )
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
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
//#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"
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();
#----------------------------------------------------------------------------
# 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
#
--- /dev/null
+/*=========================================================================
+
+ 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
+
+
+
--- /dev/null
+/*=========================================================================
+
+ 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
+
--- /dev/null
+/*=========================================================================
+
+ 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
+
+
+
--- /dev/null
+/*=========================================================================
+
+ 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
+