#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkImageShiftScale.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkImageActor.h>
#include <vtkJPEGReader.h>
#include <vtkImageCast.h>
#include <vtkImageGaussianSmooth.h>
#include <vtkImageGradient.h>
#include <vtkImageMagnitude.h>
#include <vtkImageNonMaximumSuppression.h>
#include <vtkImageConstantPad.h>
#include <vtkImageToStructuredPoints.h>
#include <vtkLinkEdgels.h>
#include <vtkThreshold.h>
#include <vtkGeometryFilter.h>
#include <vtkSubPixelPositionEdgels.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
#include <vtkStripper.h>
#include <vtkPolyDataMapper.h>
int main(int argc, char* argv[])
{
QString pngPath = QString("D:/tmp1/4698AF6023D53AE4A616FEA9BDF581A54882A443/mask/1/肺/SHENG_0086.png");
vtkNew<vtkPNGReader> reader;
reader->SetFileName(pngPath.toLocal8Bit().data());
reader->Update();
vtkNew<vtkImageCast> ic;
ic->SetOutputScalarTypeToFloat();
ic->SetInputConnection(reader->GetOutputPort());
ic->Update();
vtkNew<vtkImageGaussianSmooth> gs;
gs->SetInputConnection(ic->GetOutputPort());
gs->SetDimensionality(2);
gs->SetRadiusFactors(1, 1, 0);
gs->Update();
vtkNew<vtkImageGradient> imgGradient;
imgGradient->SetInputConnection(gs->GetOutputPort());
imgGradient->SetDimensionality(2);
imgGradient->Update();
vtkNew<vtkImageMagnitude> imgMagnitude;
imgMagnitude->SetInputConnection(imgGradient->GetOutputPort());
imgMagnitude->Update();
vtkNew<vtkImageNonMaximumSuppression> nonMax;
nonMax->SetMagnitudeInputData(imgMagnitude->GetOutput());
nonMax->SetVectorInputData(imgGradient->GetOutput());
nonMax->SetDimensionality(2);
nonMax->Update();
vtkNew<vtkImageConstantPad> pad;
pad->SetInputConnection(imgGradient->GetOutputPort());
pad->SetOutputNumberOfScalarComponents(3);
pad->SetConstant(0);
pad->Update();
vtkNew<vtkImageToStructuredPoints> i2sp1;
i2sp1->SetInputConnection(nonMax->GetOutputPort());
i2sp1->SetVectorInputData(pad->GetOutput());
i2sp1->Update();
vtkNew<vtkLinkEdgels> imgLink;
imgLink->SetInputData(i2sp1->GetOutput());
imgLink->SetGradientThreshold(2);
imgLink->Update();
vtkNew<vtkThreshold> thresholdEdgels;
thresholdEdgels->SetInputConnection(imgLink->GetOutputPort());
thresholdEdgels->ThresholdByUpper(10);
thresholdEdgels->AllScalarsOff();
thresholdEdgels->Update();
vtkNew<vtkGeometryFilter> gf;
gf->SetInputConnection(thresholdEdgels->GetOutputPort());
gf->Update();
vtkNew<vtkImageToStructuredPoints> i2sp;
i2sp->SetInputConnection(imgMagnitude->GetOutputPort());
i2sp->SetVectorInputData(pad->GetOutput());
i2sp->Update();
vtkNew<vtkSubPixelPositionEdgels> spe;
spe->SetInputConnection(gf->GetOutputPort());
spe->SetGradMapsData(i2sp->GetStructuredPointsOutput());
spe->Update();
vtkNew<vtkStripper> strip;
strip->SetInputConnection(spe->GetOutputPort());
strip->Update();
vtkNew<vtkPolyDataMapper> dsm;
dsm->SetInputConnection(strip->GetOutputPort());
dsm->ScalarVisibilityOff();
dsm->Update();
vtkNew<vtkActor> planeActor;
planeActor->SetMapper(dsm);
planeActor->GetProperty()->SetAmbient(1.0);
planeActor->GetProperty()->SetDiffuse(0.0);
planeActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
vtkNew<vtkImageActor> originalActor;
originalActor->SetInputData(reader->GetOutput());
double originalViewport[4] = {0.0, 0.0, 0.5, 1.0};
double gradviewport[4] = {0.5, 0.0, 1.0, 1.0};
vtkNew<vtkRenderer> originalRenderer;
originalRenderer->SetViewport(originalViewport);
originalRenderer->AddActor(originalActor);
originalRenderer->ResetCamera();
originalRenderer->SetBackground(1.0, 1.0, 1.0);
vtkNew<vtkRenderer> gradRenderer;
gradRenderer->SetViewport(gradviewport);
gradRenderer->AddActor(planeActor);
gradRenderer->ResetCamera();
gradRenderer->SetBackground(1.0, 1.0, 1.0);
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->SetSize(900, 300);
renderWindow->AddRenderer(originalRenderer);
renderWindow->AddRenderer(gradRenderer);//轮廓
renderWindow->Render();
vtkNew<vtkRenderWindowInteractor> interactor;
vtkNew<vtkInteractorStyleImage> style;
interactor->SetInteractorStyle(style);
interactor->SetRenderWindow(renderWindow);
interactor->Initialize();
interactor->Start();
return EXIT_SUCCESS;
}