From 771693e697633fa631dbaa4823404eb2890136e5 Mon Sep 17 00:00:00 2001 From: caballero Date: Mon, 30 Mar 2009 12:58:31 +0000 Subject: [PATCH] Added ITK Segmentation Algorithm --- appli/wxContourGUIExample/CMakeLists.txt | 1 + .../interfMainPanel.cxx | 8 +- .../interfMainPanel.h | 2 + .../interfSegmentationPanels.cxx | 86 ++-- .../interfSegmentationPanels.h | 16 +- .../wxContourMainFrame.cxx | 448 ++++++++++++++++++ .../wxContourMainFrame.h | 28 +- .../CMakeLists.txt | 2 +- .../itkImageToVTKImageFilter.h | 103 ++++ .../itkImageToVTKImageFilter.txx | 144 ++++++ .../itkVTKImageToImageFilter.h | 107 +++++ .../itkVTKImageToImageFilter.txx | 144 ++++++ 12 files changed, 1025 insertions(+), 64 deletions(-) create mode 100644 lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.h create mode 100644 lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.txx create mode 100644 lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.h create mode 100644 lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.txx diff --git a/appli/wxContourGUIExample/CMakeLists.txt b/appli/wxContourGUIExample/CMakeLists.txt index 3cb63f8..ef609de 100644 --- a/appli/wxContourGUIExample/CMakeLists.txt +++ b/appli/wxContourGUIExample/CMakeLists.txt @@ -12,6 +12,7 @@ TARGET_LINK_LIBRARIES( wxContourGUIExample # ${WXWIDGETS_LIBRARIES} ${VTK_LIBRARIES} + ${ITK_LIBRARIES} ${creaEnvironment_LIBRARIES} ${creaMaracasVisu_LIBRARIES} ${creaImageIO_LIBRARIES} diff --git a/lib/Interface_Icons_NDimensions/interfMainPanel.cxx b/lib/Interface_Icons_NDimensions/interfMainPanel.cxx index 4c67ae2..518991a 100644 --- a/lib/Interface_Icons_NDimensions/interfMainPanel.cxx +++ b/lib/Interface_Icons_NDimensions/interfMainPanel.cxx @@ -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(){ diff --git a/lib/Interface_Icons_NDimensions/interfMainPanel.h b/lib/Interface_Icons_NDimensions/interfMainPanel.h index bfbeb4f..9686837 100644 --- a/lib/Interface_Icons_NDimensions/interfMainPanel.h +++ b/lib/Interface_Icons_NDimensions/interfMainPanel.h @@ -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); diff --git a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx index a9cd147..306370d 100644 --- a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx +++ b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.cxx @@ -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 ) diff --git a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h index 605e1b1..bf830ae 100644 --- a/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h +++ b/lib/Interface_Icons_NDimensions/interfSegmentationPanels.h @@ -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 diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx index a3aba8d..e81e730 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx @@ -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 ConnectorType; + typedef itk::ImageToVTKImageFilter 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 "<GetNumberOfPoints()<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 vecX; + std::vector vecY; + std::vector vecXo; + std::vector vecYo; + std::vector::iterator vecXoi; + std::vector::iterator vecYoi; + std::vector vecZ; + + std::vector vecCtrlPointX; + std::vector vecCtrlPointY; + std::vector 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;iiGetPoint(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 <11) + { + vecXo.push_back(p[0]); + vecYo.push_back(p[1]); + } + else + { + vecX.push_back( p[0] ); + myfile <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 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 ; jAddPoint( 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 diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h index 9ceabd9..b48f08a 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h @@ -64,9 +64,29 @@ //#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 +#include #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(); diff --git a/lib/kernel_ManagerContour_NDimensions/CMakeLists.txt b/lib/kernel_ManagerContour_NDimensions/CMakeLists.txt index 591a67b..04b1bc3 100644 --- a/lib/kernel_ManagerContour_NDimensions/CMakeLists.txt +++ b/lib/kernel_ManagerContour_NDimensions/CMakeLists.txt @@ -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 index 0000000..b3a4df8 --- /dev/null +++ b/lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.h @@ -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 ITK_EXPORT ImageToVTKImageFilter : public ProcessObject +{ +public: + /** Standard class typedefs. */ + typedef ImageToVTKImageFilter Self; + typedef ProcessObject Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer 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 index 0000000..4dd66f9 --- /dev/null +++ b/lib/kernel_ManagerContour_NDimensions/itkImageToVTKImageFilter.txx @@ -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 +ImageToVTKImageFilter +::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 +ImageToVTKImageFilter +::~ImageToVTKImageFilter() +{ + if( m_Importer ) + { + m_Importer->Delete(); + m_Importer = 0; + } +} + + + +/** + * Set an itk::Image as input + */ +template +void +ImageToVTKImageFilter +::SetInput( const InputImageType * inputImage ) +{ + m_Exporter->SetInput( inputImage ); +} + + + +/** + * Get a vtkImage as output + */ +template +vtkImageData * +ImageToVTKImageFilter +::GetOutput() const +{ + return m_Importer->GetOutput(); +} + + + + +/** + * Get the importer filter + */ +template +vtkImageImport * +ImageToVTKImageFilter +::GetImporter() const +{ + return m_Importer; +} + + + +/** + * Get the exporter filter + */ +template +typename ImageToVTKImageFilter::ExporterFilterType * +ImageToVTKImageFilter +::GetExporter() const +{ + return m_Exporter.GetPointer(); +} + + + +/** + * Delegate the Update to the importer + */ +template +void +ImageToVTKImageFilter +::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 index 0000000..4a343c6 --- /dev/null +++ b/lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.h @@ -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 ITK_EXPORT VTKImageToImageFilter : public ProcessObject +{ +public: + /** Standard class typedefs. */ + typedef VTKImageToImageFilter Self; + typedef ProcessObject Superclass; + typedef SmartPointer Pointer; + typedef SmartPointer 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 index 0000000..cf86a84 --- /dev/null +++ b/lib/kernel_ManagerContour_NDimensions/itkVTKImageToImageFilter.txx @@ -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 +VTKImageToImageFilter +::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 +VTKImageToImageFilter +::~VTKImageToImageFilter() +{ + if( m_Exporter ) + { + m_Exporter->Delete(); + m_Exporter = 0; + } +} + + + +/** + * Set a vtkImageData as input + */ +template +void +VTKImageToImageFilter +::SetInput( vtkImageData * inputImage ) +{ + m_Exporter->SetInput( inputImage ); +} + + + +/** + * Get an itk::Image as output + */ +template +const typename VTKImageToImageFilter::OutputImageType * +VTKImageToImageFilter +::GetOutput() const +{ + return m_Importer->GetOutput(); +} + + + + +/** + * Get the exporter filter + */ +template +vtkImageExport * +VTKImageToImageFilter +::GetExporter() const +{ + return m_Exporter; +} + + + +/** + * Get the importer filter + */ +template +typename VTKImageToImageFilter::ImporterFilterType * +VTKImageToImageFilter +::GetImporter() const +{ + return m_Importer; +} + + + + +/** + * Delegate the Update to the importer + */ +template +void +VTKImageToImageFilter +::Update() +{ + m_Importer->Update(); +} + + + + +} // end namespace itk + +#endif + -- 2.45.1