注:此文知识学习笔记,仅记录完整程序和实现结果,具体原理参见:
https://blog.csdn.net/www_doling_net/article/details/8541534
1、vtkImageLuminance负责将一个RGB彩色图像转换为一个单组分的灰度图像。映射公式如下:
luminance = 0.3*R + 0.59*G + 0.11*B
该公式中,R为输入图像的第一分量(红色),G为第二分量(绿色),B为第三分量(蓝色)。这个计算结果计算一个RGB颜色的亮度。该类的使用也比较简单,用户无须设置参数,代码如下:
#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("data\\lena.bmp");
//vtkImageLuminance将彩色图象转换成单组分的灰度图像
vtkSmartPointer<vtkImageLuminance>luminancefilter = vtkSmartPointer<vtkImageLuminance>::New();
luminancefilter->SetInputConnection(reader->GetOutputPort());
luminancefilter->Update();
//原始演员
vtkSmartPointer<vtkImageActor> origActor = vtkSmartPointer<vtkImageActor>::New();
origActor->SetInputData(reader->GetOutput());
//灰度演员
vtkSmartPointer<vtkImageActor> GrayActor = vtkSmartPointer<vtkImageActor>::New();
GrayActor->SetInputData(luminancefilter->GetOutput());
double origView[4] = { 0.0, 0.0, 0.5, 1.0 };
double GrayView[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> GrayRender = vtkSmartPointer<vtkRenderer>::New();
GrayRender->SetViewport(GrayView);
GrayRender->AddActor(GrayActor);
GrayRender->ResetCamera();
GrayRender->SetBackground(1.0, 1.0, 1.0);
vtkSmartPointer<vtkRenderWindow>renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(origRender);
renderWindow->AddRenderer(GrayRender);
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 EXIT_SUCCESS;
}
运行结果如下:
2、vtkImageExtractComponents提取彩色图像的各个颜色成分
VTK中利用vtkImageExtractComponents可以方便的提取出彩色图像的各个颜色分量,该类的使用比较简单,只需要设置要提取的分量序号即可。下面代码说明了怎样提取彩色图像的某个颜色分量。
#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("data\\lena.bmp");
//vtkImageExtractComponents提取彩色图像的各个颜色成分
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;
}
参考资料:
1.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
2. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.