1.灰度图像映射
vtkImageLuminance负责将一个RGB彩色图像转换为一个单组分的灰度图像。映射公式如下:
luminance = 0.3*R + 0.59*G + 0.11*B
该公式中,R为输入图像的第一分量(红色),G为第二分量(绿色),B为第三分量(蓝色)。这个计算结果计算一个RGB颜色的亮度。该类的使用也比较简单,用户无须设置参数,代码如下:
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkBMPReader.h> #include <vtkImageLuminance.h> #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> int main() { vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New(); reader->SetFileName("lena.bmp"); vtkSmartPointer<vtkImageLuminance> luminanceFilter = vtkSmartPointer<vtkImageLuminance>::New(); luminanceFilter->SetInputConnection(reader->GetOutputPort()); luminanceFilter->Update(); //原始演员 vtkSmartPointer<vtkImageActor> origActor = vtkSmartPointer<vtkImageActor>::New(); origActor->SetInputData(reader->GetOutput()); //灰度演员 vtkSmartPointer<vtkImageActor> shiftscaleActor = vtkSmartPointer<vtkImageActor>::New(); shiftscaleActor->SetInputData(luminanceFilter->GetOutput()); double origView[4] = { 0.0, 0.0, 0.5, 1.0 }; double shiftscaleView[4] = { 0.5, 0.0, 1.0, 1.0 }; //原始演员化妆 vtkSmartPointer<vtkRenderer> origRender = vtkSmartPointer<vtkRenderer>::New(); origRender->SetViewport(origView); origRender->AddActor(origActor); origRender->ResetCamera(); origRender->SetBackground(1.0, 1.0, 1.0); //灰度演员化妆 vtkSmartPointer<vtkRenderer> shiftscaleRender = vtkSmartPointer<vtkRenderer>::New(); shiftscaleRender->SetViewport(shiftscaleView); shiftscaleRender->AddActor(shiftscaleActor); shiftscaleRender->ResetCamera(); shiftscaleRender->SetBackground(1.0, 1.0, 1.0); vtkSmartPointer<vtkRenderWindow> renderwindow = vtkSmartPointer<vtkRenderWindow>::New(); renderwindow->AddRenderer(origRender); renderwindow->AddRenderer(shiftscaleRender); renderwindow->SetSize(720, 480); renderwindow->Render(); renderwindow->SetWindowName("RGB to Gray"); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); rwi->SetInteractorStyle(style); rwi->SetRenderWindow(renderwindow); rwi->Initialize(); rwi->Start(); return 0; }
2.彩色图像RGB成分提取
VTK中利用vtkImageExtractComponents可以方便的提取出彩色图像的各个颜色分量,该类的使用比较简单,只需要设置要提取的分量序号即可。下面代码说明了怎样提取彩色图像的某个颜色分量。
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkBMPReader.h> #include <vtkImageExtractComponents.h> #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> int main() { vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New(); reader->SetFileName("lena.bmp"); vtkSmartPointer<vtkImageExtractComponents> redComponent = vtkSmartPointer<vtkImageExtractComponents>::New(); redComponent->SetInputConnection(reader->GetOutputPort()); redComponent->SetComponents(0); redComponent->Update(); vtkSmartPointer<vtkImageExtractComponents> greenComponent = vtkSmartPointer<vtkImageExtractComponents>::New(); greenComponent->SetInputConnection(reader->GetOutputPort()); greenComponent->SetComponents(1); greenComponent->Update(); vtkSmartPointer<vtkImageExtractComponents> blueComponent = vtkSmartPointer<vtkImageExtractComponents>::New(); blueComponent->SetInputConnection(reader->GetOutputPort()); blueComponent->SetComponents(2); blueComponent->Update(); //创建演员 vtkSmartPointer<vtkImageActor> origActor = vtkSmartPointer<vtkImageActor>::New(); origActor->SetInputData(reader->GetOutput()); vtkSmartPointer<vtkImageActor> redActor = vtkSmartPointer<vtkImageActor>::New(); redActor->SetInputData(redComponent->GetOutput()); vtkSmartPointer<vtkImageActor> greenActor = vtkSmartPointer<vtkImageActor>::New(); greenActor->SetInputData(greenComponent->GetOutput()); vtkSmartPointer<vtkImageActor> blueActor = vtkSmartPointer<vtkImageActor>::New(); blueActor->SetInputData(blueComponent->GetOutput()); //定义窗口 并化妆 double origView[4] = { 0.0, 0.0, 0.25, 1.0 }; double redView[4] = { 0.25, 0.0, 0.5, 1.0 }; double greenView[4] = { 0.5, 0.0, 0.75, 1.0 }; double blueView[4] = { 0.75, 0.0, 1.0, 1.0 }; vtkSmartPointer<vtkRenderer> origRender = vtkSmartPointer<vtkRenderer>::New(); origRender->SetViewport(origView); origRender->AddActor(origActor); origRender->ResetCamera(); origRender->SetBackground(1.0, 1.0, 1.0); vtkSmartPointer<vtkRenderer> redRender = vtkSmartPointer<vtkRenderer>::New(); redRender->SetViewport(redView); redRender->AddActor(redActor); redRender->ResetCamera(); redRender->SetBackground(1.0, 1.0, 1.0); vtkSmartPointer<vtkRenderer> greenRender = vtkSmartPointer<vtkRenderer>::New(); greenRender->SetViewport(greenView); greenRender->AddActor(greenActor); greenRender->ResetCamera(); greenRender->SetBackground(1.0, 1.0, 1.0); vtkSmartPointer<vtkRenderer> blueRender = vtkSmartPointer<vtkRenderer>::New(); blueRender->SetViewport(blueView); blueRender->AddActor(blueActor); blueRender->ResetCamera(); blueRender->SetBackground(1.0, 1.0, 1.0); //上舞台 vtkSmartPointer<vtkRenderWindow> renderwindow = vtkSmartPointer<vtkRenderWindow>::New(); renderwindow->AddRenderer(origRender); renderwindow->AddRenderer(redRender); renderwindow->AddRenderer(greenRender); renderwindow->AddRenderer(blueRender); renderwindow->SetSize(960, 320); renderwindow->Render(); renderwindow->SetWindowName("ExtraImageColorComponents"); //设置交互 vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); rwi->SetInteractorStyle(style); rwi->SetRenderWindow(renderwindow); rwi->Initialize(); rwi->Start(); return 0; }