From 0ac5c532df0c8e1506a58b22ccb4369426f56c4f Mon Sep 17 00:00:00 2001 From: Eduardo DAVILA Date: Wed, 18 Mar 2020 14:26:43 +0100 Subject: [PATCH] #3377 creaContours Bug New Normal - vtk8itk5wx3-mingw64 --- .../wxContourMainFrame.cxx | 486 ++++++------------ .../wxContourMainFrame.h | 3 + 2 files changed, 170 insertions(+), 319 deletions(-) diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx index 793e05d..1ce5849 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx @@ -1398,473 +1398,321 @@ void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString d 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; //EED10JUIN2011 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(); - + 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(); - -printf("EED wxContourMainFrame::SegmentationOneSliceITK Skypping this code. Not compiling GeodesicActiveContourLevelSetImageFilter in fedora 17 with ITK 3.20.1 \n "); -/*EED 17 sept 2010 - > - > - > - > - > - > - > - > - > - > - > - > - > - > - > - > - Not compiling GeodesicActiveContourLevelSetImageFilter in fedora 17 with ITK 3.20.1 - - 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( crea::wx2std(prop).c_str() ); - geodesicActiveContour->SetPropagationScaling( propagationScaling ); geodesicActiveContour->SetCurvatureScaling( 1.0 ); geodesicActiveContour->SetAdvectionScaling( 1.0 ); - geodesicActiveContour->SetMaximumRMSError( 0.02 ); int it=atoi( crea::wx2std(iter).c_str() ); 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( crea::wx2std(sigm).c_str() ); + const double sigma = atof( crea::wx2std(sigm).c_str() ); gradientMagnitude->SetSigma( sigma ); - - const double alpha = atof( crea::wx2std(alf).c_str() ); - const double beta = atof( crea::wx2std(bet).c_str() ); - + const double alpha = atof( crea::wx2std(alf).c_str() ); + const double beta = atof( crea::wx2std(bet).c_str() ); 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; - + seedPosition[0] = x; + seedPosition[1] = y; const double initialDistance = atof( crea::wx2std(distanc).c_str() ); - 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->SetOutputSize( connector->GetOutput()->GetBufferedRegion().GetSize() ); fastMarching->SetStoppingValue( 800 ); try { - - connector2->Update(); - vtkImageData *idata = connector2->GetOutput(); - - vtkMarchingContourFilter* cntVTK = vtkMarchingContourFilter::New( ); - - cntVTK->SetNumberOfContours( 1 ); - cntVTK->SetValue( 0, 255 ); +// connector2->Update(); + vtkImageData *idata = NULL; + idata = connector2->GetOutput(); + vtkMarchingContourFilter* cntVTK = vtkMarchingContourFilter::New( ); + cntVTK->SetNumberOfContours( 1 ); + cntVTK->SetValue( 0, 255 ); //EED 2017-01-01 Migration VTK7 #if VTK_MAJOR_VERSION <= 5 - cntVTK->SetInput( idata ); - cntVTK->Update( ); - cntVTK->UpdateInformation(); + cntVTK->SetInput( idata ); + cntVTK->Update( ); + cntVTK->UpdateInformation(); #else - cntVTK->SetInputData( idata ); + cntVTK->SetInputData( idata ); #endif - - vtkCleanPolyData* cpd = vtkCleanPolyData::New( ); - + vtkCleanPolyData* cpd = vtkCleanPolyData::New( ); //EED 2017-01-01 Migration VTK7 #if VTK_MAJOR_VERSION <= 5 - cpd->SetInput( cntVTK->GetOutput( ) ); - cpd->Update( ); - cpd->UpdateInformation(); + cpd->SetInput( cntVTK->GetOutput( ) ); + cpd->Update( ); + cpd->UpdateInformation(); #else - cpd->SetInputData( cntVTK->GetOutput( ) ); + cpd->SetInputData( cntVTK->GetOutput( ) ); #endif - - - vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( ); - conn->SetExtractionModeToLargestRegion( ); + vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( ); + conn->SetExtractionModeToLargestRegion( ); //EED 2017-01-01 Migration VTK7 #if VTK_MAJOR_VERSION <= 5 - conn->SetInput( cpd->GetOutput( ) ); - conn->Update( ); - conn->UpdateInformation(); + conn->SetInput( cpd->GetOutput( ) ); + conn->Update( ); + conn->UpdateInformation(); #else - conn->SetInputData( cpd->GetOutput( ) ); + conn->SetInputData( cpd->GetOutput( ) ); #endif - - - vtkStripper* vtkstripper = vtkStripper::New( ); - + vtkStripper* vtkstripper = vtkStripper::New( ); //EED 2017-01-01 Migration VTK7 #if VTK_MAJOR_VERSION <= 5 - vtkstripper->SetInput( conn->GetOutput() ); - vtkstripper->Update(); - vtkstripper->UpdateInformation(); + vtkstripper->SetInput( conn->GetOutput() ); + vtkstripper->Update(); + vtkstripper->UpdateInformation(); #else - vtkstripper->SetInputData( conn->GetOutput() ); - cntVTK->Update(); + vtkstripper->SetInputData( conn->GetOutput() ); + cntVTK->Update(); #endif - - vtkPolyData* polyDataResult = cntVTK->GetOutput(); - //std::cout<<"Points "<GetNumberOfPoints()<GetOutput(); + //std::cout<<"Points "<GetNumberOfPoints()<Update( ); - polyDataResult->UpdateInformation(); + polyDataResult->Update( ); + polyDataResult->UpdateInformation(); #else // .. #endif - - //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) + 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;ii1 || (xAct-x)<-1) + if(ii==0) { - vecX.push_back( p[0] ); - vecY.push_back( p[1] ); - myfile <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 <11) { 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 <SetContour( &vecX , &vecY , &vecZ ); + 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 + 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; + std::vector actualInstantVector; + _instantPanel->getInstant( actualInstantVector ); + actualInstantVector[1]=z; - int j,sizeCtrPt = vecCtrlPointX.size(); + int j,sizeCtrPt = vecCtrlPointX.size(); - manualBaseModel *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 + manualBaseModel *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 + } catch( itk::ExceptionObject & excep ) { + std::cerr << "Exception caught !" << std::endl; + std::cerr << excep << std::endl; + } // try -/* -//EED10JUIN2011 - 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){ diff --git a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h index fac56dd..3e31bbd 100644 --- a/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h +++ b/lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.h @@ -82,6 +82,9 @@ //EED10JUIN2011 #include "itkImageFileWriter.h" +//EED2020-03-18 +#undef Success + #include "itkImageToVTKImageFilter.h" #include "itkVTKImageToImageFilter.h" -- 2.45.1