1 #include "vtkAutoInit.h" 2 VTK_MODULE_INIT(vtkRenderingOpenGL2); 3 VTK_MODULE_INIT(vtkInteractionStyle); 4 5 #include <vtkSmartPointer.h> 6 #include <vtkImageMathematics.h> 7 #include <vtkImageData.h> 8 #include <vtkImageSobel2D.h> 9 #include <vtkImageMagnitude.h> 10 #include <vtkImageExtractComponents.h> 11 #include <vtkImageShiftScale.h> 12 #include <vtkRenderWindow.h> 13 #include <vtkRenderWindowInteractor.h> 14 #include <vtkInteractorStyleImage.h> 15 #include <vtkRenderer.h> 16 #include <vtkImageActor.h> 17 #include <vtkJPEGReader.h> 18 19 //测试图像:../data/lena-gray.jpg 20 int main(int argc, char* argv[]) 21 { 22 vtkSmartPointer<vtkJPEGReader> reader = 23 vtkSmartPointer<vtkJPEGReader>::New(); 24 reader->SetFileName("lena-gray.jpg"); 25 reader->Update(); 26 27 vtkSmartPointer<vtkImageSobel2D> sobelFilter = 28 vtkSmartPointer<vtkImageSobel2D>::New(); 29 sobelFilter->SetInputConnection(reader->GetOutputPort()); 30 31 vtkSmartPointer<vtkImageExtractComponents> extractXFilter = 32 vtkSmartPointer<vtkImageExtractComponents>::New(); 33 extractXFilter->SetComponents(0); 34 extractXFilter->SetInputConnection(sobelFilter->GetOutputPort()); 35 extractXFilter->Update(); 36 37 double xRange[2]; 38 extractXFilter->GetOutput()->GetScalarRange(xRange); 39 40 vtkSmartPointer<vtkImageMathematics> xImageAbs = 41 vtkSmartPointer<vtkImageMathematics>::New(); 42 xImageAbs->SetOperationToAbsoluteValue(); 43 xImageAbs->SetInputConnection(extractXFilter->GetOutputPort()); 44 xImageAbs->Update(); 45 46 vtkSmartPointer<vtkImageShiftScale> xShiftScale = 47 vtkSmartPointer<vtkImageShiftScale>::New(); 48 xShiftScale->SetOutputScalarTypeToUnsignedChar(); 49 xShiftScale->SetScale( 255 / xRange[1] ); 50 xShiftScale->SetInputConnection(xImageAbs->GetOutputPort()); 51 xShiftScale->Update(); 52 53 vtkSmartPointer<vtkImageExtractComponents> extractYFilter = 54 vtkSmartPointer<vtkImageExtractComponents>::New(); 55 extractYFilter->SetComponents(1); 56 extractYFilter->SetInputConnection(sobelFilter->GetOutputPort()); 57 extractYFilter->Update(); 58 59 double yRange[2]; 60 extractYFilter->GetOutput()->GetScalarRange(yRange); 61 62 vtkSmartPointer<vtkImageMathematics> yImageAbs = 63 vtkSmartPointer<vtkImageMathematics>::New(); 64 yImageAbs->SetOperationToAbsoluteValue(); 65 yImageAbs->SetInputConnection(extractYFilter->GetOutputPort()); 66 yImageAbs->Update(); 67 68 vtkSmartPointer<vtkImageShiftScale> yShiftScale = 69 vtkSmartPointer<vtkImageShiftScale>::New(); 70 yShiftScale->SetOutputScalarTypeToUnsignedChar(); 71 yShiftScale->SetScale( 255 / yRange[1] ); 72 yShiftScale->SetInputConnection(yImageAbs->GetOutputPort()); 73 yShiftScale->Update(); 74 75 vtkSmartPointer<vtkImageActor> originalActor = 76 vtkSmartPointer<vtkImageActor>::New(); 77 originalActor->SetInputData(reader->GetOutput()); 78 79 vtkSmartPointer<vtkImageActor> xActor = 80 vtkSmartPointer<vtkImageActor>::New(); 81 xActor->SetInputData(xShiftScale->GetOutput()); 82 83 vtkSmartPointer<vtkImageActor> yActor = 84 vtkSmartPointer<vtkImageActor>::New(); 85 yActor->SetInputData(yShiftScale->GetOutput()); 86 87 double originalViewport[4] = {0.0, 0.0, 0.33, 1.0}; 88 double xViewport[4] = {0.33, 0.0, 0.66, 1.0}; 89 double yViewport[4] = {0.66, 0.0, 1.0, 1.0}; 90 91 vtkSmartPointer<vtkRenderer> originalRenderer = 92 vtkSmartPointer<vtkRenderer>::New(); 93 originalRenderer->SetViewport(originalViewport); 94 originalRenderer->AddActor(originalActor); 95 originalRenderer->ResetCamera(); 96 originalRenderer->SetBackground(1.0, 1.0, 1.0); 97 98 vtkSmartPointer<vtkRenderer> xRenderer = 99 vtkSmartPointer<vtkRenderer>::New(); 100 xRenderer->SetViewport(xViewport); 101 xRenderer->AddActor(xActor); 102 xRenderer->ResetCamera(); 103 xRenderer->SetBackground(1.0, 1.0, 1.0); 104 105 vtkSmartPointer<vtkRenderer> yRenderer = 106 vtkSmartPointer<vtkRenderer>::New(); 107 yRenderer->SetViewport(yViewport); 108 yRenderer->AddActor(yActor); 109 yRenderer->ResetCamera(); 110 yRenderer->SetBackground(1.0, 1.0, 1.0); 111 112 vtkSmartPointer<vtkRenderWindow> renderWindow = 113 vtkSmartPointer<vtkRenderWindow>::New(); 114 renderWindow->SetSize(1200, 300); 115 renderWindow->AddRenderer(originalRenderer); 116 renderWindow->AddRenderer(xRenderer); 117 renderWindow->AddRenderer(yRenderer); 118 renderWindow->Render(); 119 renderWindow->SetWindowName("SobelExample"); 120 121 vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 122 vtkSmartPointer<vtkRenderWindowInteractor>::New(); 123 vtkSmartPointer<vtkInteractorStyleImage> style = 124 vtkSmartPointer<vtkInteractorStyleImage>::New(); 125 126 renderWindowInteractor->SetInteractorStyle(style); 127 renderWindowInteractor->SetRenderWindow(renderWindow); 128 renderWindowInteractor->Initialize(); 129 renderWindowInteractor->Start(); 130 131 return EXIT_SUCCESS; 132 }