一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

1.前言

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

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

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

2.实验代码和结果

复制代码
  1 #include <vtkAutoInit.h>
  2 VTK_MODULE_INIT(vtkRenderingOpenGL);
  3  
  4 #include <vtkSmartPointer.h>
  5 #include <vtkJPEGReader.h>
  6 //#include <vtkImageCast.h>
  7 #include <vtkImageData.h>
  8 #include <vtkImageCanvasSource2D.h>
  9 #include <vtkImageBlend.h>
 10 #include <vtkImageActor.h>
 11 #include <vtkRenderer.h>
 12 #include <vtkRenderWindow.h>
 13 #include <vtkRenderWindowInteractor.h>
 14 #include <vtkInteractorStyleImage.h>
 15  
 16 int main()
 17 {
 18 //数据管线
 19     vtkSmartPointer<vtkJPEGReader> reader =
 20         vtkSmartPointer<vtkJPEGReader>::New();
 21     reader->SetFileName("data/lena-gray.jpg");
 22     reader->Update();
 23  
 24     vtkSmartPointer<vtkImageCanvasSource2D> source=
 25         vtkSmartPointer<vtkImageCanvasSource2D>::New();
 26     source->SetNumberOfScalarComponents(1);
 27     source->SetScalarTypeToUnsignedChar();
 28     source->SetExtent(0,512,0,512,0,0);
 29     source->SetDrawColor(0,0,0);
 30     source->FillBox(0,512,0,512);
 31     source->SetDrawColor(255,255,255);
 32     source->FillBox(100,400,100,400);
 33     source->Update();
 34  
 35     vtkSmartPointer<vtkImageBlend> blend =
 36         vtkSmartPointer<vtkImageBlend>::New();
 37     blend->SetInputData(0,reader->GetOutput());
 38     blend->SetInputData(1,source->GetOutput());
 39     blend->SetOpacity(0,0.4);
 40     blend->SetOpacity(1,0.6);
 41     blend->Update();
 42     
 43 //渲染引擎
 44     vtkSmartPointer<vtkImageActor> actor1 =
 45         vtkSmartPointer<vtkImageActor>::New();
 46     actor1->SetInputData(reader->GetOutput());
 47  
 48     vtkSmartPointer<vtkImageActor> actor2 =
 49         vtkSmartPointer<vtkImageActor>::New();
 50     actor2->SetInputData(source->GetOutput());
 51  
 52     vtkSmartPointer<vtkImageActor> blend_actor =
 53         vtkSmartPointer<vtkImageActor>::New();
 54     blend_actor->SetInputData(blend->GetOutput());
 55     //定义视窗大小(xmin.ymin,xmax,ymax)
 56     //按window的尺寸进行比例分割
 57     double leftViewport [4] = {0,0,0.33,1};
 58     double midViewport  [4] = {0.33,0,0.66,1};
 59     double rightViewport[4] = {0.66,0,1,1};
 60     //render
 61     vtkSmartPointer<vtkRenderer> render1 = 
 62         vtkSmartPointer<vtkRenderer>::New();
 63     render1->SetViewport(leftViewport);
 64     render1->AddActor(actor1);
 65     render1->ResetCamera();
 66     render1->SetBackground(1,0,0);
 67  
 68     vtkSmartPointer<vtkRenderer> render2 = 
 69         vtkSmartPointer<vtkRenderer>::New();
 70     render2->SetViewport(midViewport);
 71     render2->AddActor(actor2);
 72     render2->ResetCamera();
 73     render2->SetBackground(0,1,0);
 74  
 75     vtkSmartPointer<vtkRenderer> render3 = 
 76         vtkSmartPointer<vtkRenderer>::New();
 77     render3->SetViewport(rightViewport);
 78     render3->AddActor(blend_actor);
 79     render3->ResetCamera();
 80     render3->SetBackground(0,0,1);
 81     //window
 82     vtkSmartPointer<vtkRenderWindow> renderwindow =
 83         vtkSmartPointer<vtkRenderWindow>::New();
 84     renderwindow->AddRenderer(render1);
 85     renderwindow->AddRenderer(render2);
 86     renderwindow->AddRenderer(render3);
 87     renderwindow->SetSize(640,320);
 88     renderwindow->SetWindowName("Image-Fusion");
 89     renderwindow->Render();
 90     //interactor
 91     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
 92         vtkSmartPointer<vtkRenderWindowInteractor>::New();
 93     vtkSmartPointer<vtkInteractorStyleImage> style =
 94         vtkSmartPointer<vtkInteractorStyleImage>::New();
 95     rwi->SetInteractorStyle(style);
 96     rwi->SetRenderWindow(renderwindow);
 97     rwi->Initialize();
 98     rwi->Start();
 99  
100     return 0;
101 }
复制代码

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

 

posted on   一杯清酒邀明月  阅读(1365)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-01-06 VisionPro 图标工具说明
2020-01-06 Qt OpenCV::Mat与Qt::QImage相互转换
2020-01-06 QT .和::和:和->
2020-01-06 Qt QImage的浅拷贝与深拷贝
2020-01-06 Qt QImag图像保存、格式转换
2020-01-06 Qt 获取当前时间
2020-01-06 Qt 信号阻塞和断开
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示