VTK 邊緣檢測算法(Canny)

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章