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 sampleData1 = vtkSmartPointer::New();
vtkSmartPointer sampleData2 = vtkSmartPointer::New();

vtkSmartPointer blend = vtkSmartPointer::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

未完待续…

你可能感兴趣的:(VTK,医学影像处理,ImageBlend,图像融合,stencil)