1.前言

前面演示的例子都是在一个窗口中显示一个图像。但是在常见的图像处理软件中,经常会遇到在一个窗口中显示多个图像,这就会用到图像融合技术。图像融合利用图像的alpha通道和不透明度来实现。VTK中vtkImageBlend实现图像的融合。

vtkImageBlend可以接收多个图像输入,输出为融合图像。输出图像的像素间隔、原点、范围(extent)以及像素组分个数与第一个图像一致。该类提供了两种融合模式,默认的融合方式是标准模式。

第二种是混合模式(Compound)。该模式下输出结果经过alpha/opacity不透明度的和做过归一化。另外还可以设置一个阈值,当alpha*opacity小于等于该阈值时会忽略该像素。

2.实验代码和结果

#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};//rendervtkSmartPointer<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);//windowvtkSmartPointer<vtkRenderWindow> renderwindow =vtkSmartPointer<vtkRenderWindow>::New();renderwindow->AddRenderer(render1);renderwindow->AddRenderer(render2);renderwindow->AddRenderer(render3);renderwindow->SetSize(640,320);renderwindow->SetWindowName("Image-Fusion");renderwindow->Render();//interactorvtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(renderwindow);rwi->Initialize();rwi->Start();return 0;
}

代码中读入了一副灰度图像,并生成了一个二值图像;然后定义了vtkImageBlend对象,函数SetInput()设置两个图像作为输入。这里设置输入图像时,由于可以输入多个图像,因此需要给定图像的id号来设置输入。SetOpacity()用于设置对应id号的图像不透明度的大小,当不透明度为1.0时,为完全不透明。

3.参考资料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道16:图像处理_窗口分割和图像融合(ViewportvtkImageBlend)相关推荐

  1. VTK修炼之道9:坐标系统及空间变换(窗口-视图分割)

    1.坐标系统 计算机图形学里常用的坐标系统主要有四种,分别是:Model坐标系统.World坐标系统.View坐标系统和Display坐标系统,以及两种表示坐标点的方式:以屏幕像素值为单位和归一化坐标 ...

  2. 【opencv】(2) 图像处理:边界填充、图像融合、图像阈值、数值计算

    主要内容有:边界填充 cv2.copyMakeBorder(),数值计算 cv2.add(),改变尺寸 cv2.resize(),图像融合 cv2.addWeighted(),图像阈值 cv2.thr ...

  3. 图像处理(十二)图像融合(1)Seamless cloning泊松克隆-Siggraph 2004

    本篇博文主要讲解2004年Siggraph的经典paper:<Poisson Image Editing>,在图像融合领域,融合效果最牛逼的paper.讲这个算法,我没打算讲太多理论的公式 ...

  4. VTK修炼之道14:图像处理_创建

    1.引言:图像数据结构 数字图像文件内容由两个部分组成:图像头信息和数据.图像头信息定义了图像的基本信息,主要包括起点位置(Origin),像素间隔(space)和维数(dimension).通过这三 ...

  5. VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)

    1.vtkImageViewer2用于图像显示实例分析 在VTK早期版本中,提供了vtkImageViewer类来显示图像.随着版本的发展,目前vtkImageViewer2代替了vtkImageVi ...

  6. VTK修炼之道28:图像统计_灰度直方图计算

    1.灰度图像直方图 直方图统计是图像处理中的一个非常重要的操作.VTK中实现直方图统计功能的filter是vtkImageAccumulate.其将每个组分的数值范围划分为离散的间隔,然后统计每个灰度 ...

  7. VTK修炼之道27:图像基本操作_三维图像切片交互提取(回调函数、观察者-命令模式)

    1.鼠标滑动提取三维图像切片 学习三维图像切面的提取后,我们可以实现一个稍微复杂的程序--通过滑动鼠标来切换三维图像切片,这也是医学图像处理软件中一个很基本的功能.实现该功能难点是怎样在VTK中控制鼠 ...

  8. VTK修炼之道82:VTK管线机制_信息对象类VTKInformation

    1.VTK管线机制 VTK中通过管线机制来实现组合各种算法处理数据.每一种算法是一个Filter,多个Filter连接在一起形成VTK管线.每个Filter可以分为两个组成部分:一个是算法对象,继承自 ...

  9. VTK修炼之道78:交互与拾取_点拾取

    1.拾取 选择拾取是人机交互过程的一个重要功能. 一个最经典的例子就是,在玩3D游戏时,场景中可能会存在多个角色,有时需要用鼠标来选择所要控制的角色,这就要用到拾取功能. 另外,在某些三维图形的编辑软 ...

最新文章

  1. Spring Data JPA
  2. jieba安装_Jieba库实现词性标注及小说人物角色抽取
  3. 2019年在NLP领域,资源有限的个人/团队能做哪些有价值有希望的工作?
  4. JavaWeb实现简易新闻管理系统
  5. net use \\192.168.54.145 /user:administrator 12345qwert无法连接,错误码1326
  6. C++结构型模式-适配器模式
  7. Ansible自动化采集数据并生成巡检报告
  8. DYNAMIC DETECTION
  9. mac 重置mysql root密码_Mac下忘记Mysql root密码重置
  10. ACM赛后总结2018.09.23
  11. 如何添加计算机硬盘分区,怎么给电脑硬盘增加设置分区
  12. VTK笔记-切面重建-使用交互器更新断层图的奇异现象的问题排查
  13. 74%的人都在加班!职场人病痛排行榜出炉!
  14. Vue-cli使用prerender-spa-plugin插件预渲染
  15. 上海旅游-徐家汇教堂
  16. Call to undefined function imagecreatefromjpeg()
  17. 2022年跨境电商(美国区)预计趋势
  18. R语言数据可视化教程(ggplot2)_其他图形
  19. 有7g,2g砝码各一个,天平一只,如何只用这些物品三次将140g的盐分成50g,90g各一份?
  20. 山东省教师职称评定取消计算机,好消息!山东省发布教师职称新规,建立专属职称制度,单独评聘...

热门文章

  1. [数字图像处理]图像去噪初步(1)--均值滤波器
  2. liunx 下巧妙使用代理服务器(squid)
  3. hdu 5185(dp)
  4. nyoj-68--三点顺序
  5. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
  6. java-判断相同和对象比较大小
  7. socket/WebSocket/WebService/http/https概念
  8. 【转载】图论 500题——主要为hdu/poj/zoj
  9. 一个多功能蓝色漂亮的搜索条
  10. TatukGIS - GisDefs - CheckDir 函数