介绍
VTK中图像融合方法-VTKImageBlend 的用法:
在一些场景中,我们需要将二张图像进行融合,在VTK中,有这种方法,就是 VTKImageBlend。
用法说明:
使用alpha或opacity混合图像
vtkImageBlend将L、LA、RGB或RGBA图像作为输入,并根据每个输入的alpha值和/或不透明度设置混合它们。
输出结果的 spacing, origin, extent, 以及像素通道与第一个输入的相同。如果输入有alpha值,那么这个alpha值将被原封不动地复制到输出中。此外,如果第一个输入有一个或两个分量,即如果它是L(灰度)或LA(灰度+α),则所有其他输入也必须是L或LA。
提供不同的混合模式:
正常(默认):这是OpenGL和其他图形包使用的标准混合模式。输出始终具有与第一个输入相同数量的通道和相同的范围。第一个输入的alpha值不用于混合计算,而是直接复制到输出。
output <- input[0]
foreach input i {
foreach pixel px {
r <- input[i](px)(alpha) * opacity[i]
f <- (255 - r)
output(px) <- output(px) * f + input(px) * r
}
}
复合:图像被复合在一起,每个组件都按alpha/不透明度值的总和进行缩放。使用CompoundThreshold方法设置在复合模式下指定阈值。不透明度*α小于或等于此阈值的像素将被忽略。第一个输入的alpha值(如果存在)不会复制到输出的alpha值。输出始终具有与第一个输入相同数量的组件和相同的范围。如果设置了CompoundAlpha,则还将使用alpha加权混合计算来计算输出的alpha值。
output <- 0
foreach pixel px {
sum <- 0
foreach input i {
r <- input[i](px)(alpha) * opacity(i)
sum <- sum + r
if r > threshold {
output(px) <- output(px) + input(px) * r
}
}
output(px) <- output(px) / sum
}
example
#!/usr/bin/env python
# encoding: utf-8
import vtk
if __name__ == '__main__':
image_jpeg_reader_vol = vtk.vtkJPEGReader()
image_jpeg_reader_vol.SetFileName(r'D:/result_1.jpg')
image_jpeg_reader_vol.Update()
print( image_jpeg_reader_vol.GetNumberOfScalarComponents())
image_jpeg_reader_mask = vtk.vtkJPEGReader()
image_jpeg_reader_mask.SetFileName(r'D:/result_2.jpg')
image_jpeg_reader_mask.Update()
print(image_jpeg_reader_mask.GetNumberOfScalarComponents())
image_blender = vtk.vtkImageBlend()
image_blender.AddInputConnection(image_jpeg_reader_vol.GetOutputPort())
image_blender.AddInputConnection(image_jpeg_reader_mask.GetOutputPort())
image_blender.SetOpacity(0, 0.5)
image_blender.SetOpacity(1, 0.5)
image_blender.Update()
# setup actor
image_actor = vtk.vtkImageActor()
image_actor.SetInputData(image_blender.GetOutput())
# setup render
renderer = vtk.vtkRenderer()
renderer.AddActor(image_actor)
renderer.ResetCamera()
renderer.SetBackground(0,0,0)
# setup window
ren_win = vtk.vtkRenderWindow()
ren_win.AddRenderer(renderer)
ren_win.SetWindowName("read and show jpg test")
ren_win.SetSize(512,512)
ren_win.Render()
style = vtk.vtkInteractorStyleImage()
rwi = vtk.vtkRenderWindowInteractor()
rwi.SetInteractorStyle(style)
rwi.SetRenderWindow(ren_win)
rwi.Initialize()
rwi.Start()