vtkImageBlend在处理图像融合时的用法

本文由Markdown语法编辑器编辑完成。

##1. vtkImageBlend的基本介绍
关于vtkImageBlend类的详细介绍,请参考链接:

blend images together using alpha or opacity.
vtkImageBlend takes L, LA, RGB, or RGBA images as input and blends them according to the alpha values and/or the opacity setting for each input.
The spacing, origin, extent, and number of components of the output are the same as those for the first input.
这个类主要是完成两个图像的融合。

##2. vtkImageBlend在处理图像融合时遇到的问题

在实际项目的编码中遇到了一个实际的需求:
已知有两个三维体数据vtkImageData, 每一个vtkImageData都是二值的,即灰度只有0和1,且这两个vtkImageData具有相同的参数(origin, spacing, extent,bounds等)。目前想将这两个三维体数据进行合并merge, 希望合并后的体数据,原来为1的像素值都可以显示出来。

通过查阅资料,有两个类可以使用: vtkImageAppend和vtkImageBlend。
但是通过实验,vtkImageAppend是无法满足该需求的。因为vtkImageAppend是沿着某一个方向去延伸图像,这样两幅图像之间是简单的叠在一起,而不是进行像素间的融合。
因此,只能采用第二个类vtkImageBlend。这个类便是实现两幅图像的融合,既可以是二维图像融合,也可以是三维图像的融合。

首次实验时的示例代码如下:

vtkSmartPointer<vtkImageData> sampleData1 = vtkSmartPointer<vtkImageData>::New();
vtkSmartPointer<vtkImageData> sampleData2 = vtkSmartPointer<vtkImageData>::New();

vtkSmartPointer<vtkImageBlend> blend = vtkSmartPointer<vtkImageBlend>::New();
blend->AddInputData(sampleData1);
blend->AddInputData(sampleData2);
blend->SetOpacity(0,0.5);
blend->SetOpacity(1,0.5);
blend->Update();

但是,在获取blend->GetOutput()后发现,二者融合后新的vtkImageData的灰度值全部变成了0,这个结果令我百思不得其解。后来,索性把两个图像的Opacity都设置为了1.0,融合后的vtkImageData的灰度值有0和1两个值,但是这个vtkImageData却和sampleData2是完全相同的。也就是说sampleData2完全覆盖住了sampleData1,因此sampleData1中灰度值为1的像素也被覆盖住了。

##3. 解决方案

后来通过请教前辈。他说在这里还需要用到一个很重要的类vtkImageToImageStencil。这个类可以完全满足刚才所说的需求。

关于这个类的使用,可以参照vtk的网站中关于这个类的一个案例来了解一下。
https://www.paraview.org/Wiki/VTK/Examples/Cxx/Images/ImageStencil

未完待续…

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inter_peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值