1.vtkImageBlend
图像融合利用图像的alpha通道和不透明度来实现。VTK中vtkImageBlend实现图像的融合。
vtkImageBlend可以接收多个图像输入,输出为融合图像。输出图像的像素间隔、原点、范围(extent)以及像素组分个数与第一个图像一致。
该类提供了两种融合模式,默认的融合方式是标准模式。
第二种是混合模式(Compound),该模式下输出结果经过alpha/opacity不透明度的和做过归一化。另外还可以设置一个阈值,当alpha*opacity小于等于该阈值时会忽略该像素。
2.代码
f
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
//#include <vtkImageCast.h>
#include <vtkImageData.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageBlend.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
int main()
{
//数据管线
vtkSmartPointer<vtkJPEGReader> reader =
vtkSmartPointer<vtkJPEGReader>::New();
reader->SetFileName("data/lena-gray.jpg");
reader->Update();
vtkSmartPointer<vtkImageCanvasSource2D> source=
vtkSmartPointer<vtkImageCanvasSource2D>::New();
source->SetNumberOfScalarComponents(1);
source->SetScalarTypeToUnsignedChar();
source->SetExtent(0,512,0,512,0,0);
source->SetDrawColor(0,0,0);
source->FillBox(0,512,0,512);
source->SetDrawColor(255,255,255);
source->FillBox(100,400,100,400);
source->Update();
vtkSmartPointer<vtkImageBlend> blend =
vtkSmartPointer<vtkImageBlend>::New();
blend->SetInputData(0,reader->GetOutput());
blend->SetInputData(1,source->GetOutput());
blend->SetOpacity(0,0.4);
blend->SetOpacity(1,0.6);
blend->Update();
//渲染引擎
vtkSmartPointer<vtkImageActor> actor1 =
vtkSmartPointer<vtkImageActor>::New();
actor1->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkImageActor> actor2 =
vtkSmartPointer<vtkImageActor>::New();
actor2->SetInputData(source->GetOutput());
vtkSmartPointer<vtkImageActor> blend_actor =
vtkSmartPointer<vtkImageActor>::New();
blend_actor->SetInputData(blend->GetOutput());
//定义视窗大小(xmin.ymin,xmax,ymax)
//按window的尺寸进行比例分割
double leftViewport [4] = {0,0,0.33,1};
double midViewport [4] = {0.33,0,0.66,1};
double rightViewport[4] = {0.66,0,1,1};
//render
vtkSmartPointer<vtkRenderer> render1 =
vtkSmartPointer<vtkRenderer>::New();
render1->SetViewport(leftViewport);
render1->AddActor(actor1);
render1->ResetCamera();
render1->SetBackground(1,0,0);
vtkSmartPointer<vtkRenderer> render2 =
vtkSmartPointer<vtkRenderer>::New();
render2->SetViewport(midViewport);
render2->AddActor(actor2);
render2->ResetCamera();
render2->SetBackground(0,1,0);
vtkSmartPointer<vtkRenderer> render3 =
vtkSmartPointer<vtkRenderer>::New();
render3->SetViewport(rightViewport);
render3->AddActor(blend_actor);
render3->ResetCamera();
render3->SetBackground(0,0,1);
//window
vtkSmartPointer<vtkRenderWindow> renderwindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderwindow->AddRenderer(render1);
renderwindow->AddRenderer(render2);
renderwindow->AddRenderer(render3);
renderwindow->SetSize(640,320);
renderwindow->SetWindowName("Image-Fusion");
renderwindow->Render();
//interactor
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style =
vtkSmartPointer<vtkInteractorStyleImage>::New();
rwi->SetInteractorStyle(style);
rwi->SetRenderWindow(renderwindow);
rwi->Initialize();
rwi->Start();
return 0;
}