VTK 实例27:将BMP类型的RGB图像提取各个颜色(R、G、B)组分(提取颜色组分)

发布时间 2023-08-15 11:34:23作者: 一杯清酒邀明月
VTK中利用vtkImageExtractComponents可以方便地提取彩色图像的各个颜色通道组分,提取出来的每一个组分数据就是一个灰度数据。

  1 #include "vtkAutoInit.h" 
  2 VTK_MODULE_INIT(vtkRenderingOpenGL2);
  3 VTK_MODULE_INIT(vtkInteractionStyle);
  4 
  5 #include <vtkImageData.h>
  6 #include <vtkSmartPointer.h>
  7 #include <vtkImageExtractComponents.h>
  8 #include <vtkRenderWindow.h>
  9 #include <vtkRenderWindowInteractor.h>
 10 #include <vtkInteractorStyleImage.h>
 11 #include <vtkRenderer.h>
 12 #include <vtkBMPReader.h>
 13 #include <vtkImageActor.h>
 14  
 15 //测试图像:../data/lena.bmp
 16 int main(int argc, char* argv[])
 17 {
 18     vtkSmartPointer<vtkBMPReader> reader =
 19         vtkSmartPointer<vtkBMPReader>::New();
 20     reader->SetFileName ("lena.bmp");
 21  
 22     vtkSmartPointer<vtkImageExtractComponents> extractRedFilter =
 23         vtkSmartPointer<vtkImageExtractComponents>::New();
 24     extractRedFilter->SetInputConnection(reader->GetOutputPort());
 25     extractRedFilter->SetComponents(0);
 26     extractRedFilter->Update();
 27  
 28     vtkSmartPointer<vtkImageExtractComponents> extractGreenFilter =
 29         vtkSmartPointer<vtkImageExtractComponents>::New();
 30     extractGreenFilter->SetInputConnection(reader->GetOutputPort());
 31     extractGreenFilter->SetComponents(1);
 32     extractGreenFilter->Update();
 33  
 34     vtkSmartPointer<vtkImageExtractComponents> extractBlueFilter =
 35         vtkSmartPointer<vtkImageExtractComponents>::New();
 36     extractBlueFilter->SetInputConnection(reader->GetOutputPort());
 37     extractBlueFilter->SetComponents(2);
 38     extractBlueFilter->Update();
 39  
 40     // Create actors
 41     vtkSmartPointer<vtkImageActor> inputActor =
 42         vtkSmartPointer<vtkImageActor>::New();
 43     inputActor->SetInputData(reader->GetOutput());
 44  
 45     vtkSmartPointer<vtkImageActor> redActor =
 46         vtkSmartPointer<vtkImageActor>::New();
 47     redActor->SetInputData(extractRedFilter->GetOutput());
 48  
 49     vtkSmartPointer<vtkImageActor> greenActor =
 50         vtkSmartPointer<vtkImageActor>::New();
 51     greenActor->SetInputData(extractGreenFilter->GetOutput());
 52  
 53     vtkSmartPointer<vtkImageActor> blueActor =
 54         vtkSmartPointer<vtkImageActor>::New();
 55     blueActor->SetInputData(extractBlueFilter->GetOutput());
 56 
 57     double inputViewport[4] = {0.0, 0.0, 0.25, 1.0};
 58     double redViewport[4] = {0.25, 0.0, 0.5, 1.0};
 59     double greenViewport[4] = {0.5, 0.0, 0.75, 1.0};
 60     double blueViewport[4] = {0.75, 0.0, 1.0, 1.0};
 61 
 62     vtkSmartPointer<vtkRenderer> inputRenderer =
 63         vtkSmartPointer<vtkRenderer>::New();
 64     inputRenderer->SetViewport(inputViewport);
 65     inputRenderer->AddActor(inputActor);
 66     inputRenderer->ResetCamera();
 67     inputRenderer->SetBackground(1.0, 1.0, 1.0);
 68  
 69     vtkSmartPointer<vtkRenderer> redRenderer =
 70         vtkSmartPointer<vtkRenderer>::New();
 71     redRenderer->SetViewport(redViewport);
 72     redRenderer->AddActor(redActor);
 73     redRenderer->ResetCamera();
 74     redRenderer->SetBackground(1.0, 1.0, 1.0);
 75  
 76     vtkSmartPointer<vtkRenderer> greenRenderer =
 77         vtkSmartPointer<vtkRenderer>::New();
 78     greenRenderer->SetViewport(greenViewport);
 79     greenRenderer->AddActor(greenActor);
 80     greenRenderer->ResetCamera();
 81     greenRenderer->SetBackground(1.0, 1.0, 1.0);
 82  
 83     vtkSmartPointer<vtkRenderer> blueRenderer =
 84         vtkSmartPointer<vtkRenderer>::New();
 85     blueRenderer->SetViewport(blueViewport);
 86     blueRenderer->AddActor(blueActor);
 87     blueRenderer->ResetCamera();
 88     blueRenderer->SetBackground(1.0, 1.0, 1.0);
 89  
 90     vtkSmartPointer<vtkRenderWindow> renderWindow =
 91         vtkSmartPointer<vtkRenderWindow>::New();
 92     renderWindow->AddRenderer(inputRenderer);
 93     renderWindow->AddRenderer(redRenderer);
 94     renderWindow->AddRenderer(greenRenderer);
 95     renderWindow->AddRenderer(blueRenderer);
 96 
 97     renderWindow->SetSize(1200, 300);
 98     renderWindow->Render();
 99     renderWindow->SetWindowName("ImageExtractComponentsExample");
100  
101     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
102         vtkSmartPointer<vtkRenderWindowInteractor>::New();
103     vtkSmartPointer<vtkInteractorStyleImage> style =
104         vtkSmartPointer<vtkInteractorStyleImage>::New();
105  
106     renderWindowInteractor->SetInteractorStyle(style);
107     renderWindowInteractor->SetRenderWindow(renderWindow);
108     renderWindowInteractor->Initialize();
109     renderWindowInteractor->Start();
110 
111     return EXIT_SUCCESS;
112 }