一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①2D图像的的边界确定,②图像数据的类型转换,②图像的权重加减
二:代码及注释
from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkImagingSources import vtkImageMandelbrotSource, vtkImageSinusoidSource from vtkmodules.vtkImagingCore import vtkImageCast from vtkmodules.vtkImagingMath import vtkImageWeightedSum from vtkmodules.vtkRenderingCore import vtkImageActor, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer def main(): colors = vtkNamedColors() # 创建第一幅图像 source1 = vtkImageMandelbrotSource() """ SetWholeExtent 用来定义任何图像或 3D 结构化数据集的边界 Xmin=0 在X轴上的起始像素的索引 Xmax=255 在x轴上的结束像素索引 后面的以此类推 """ source1.SetWholeExtent(0, 255, 0, 255, 0, 0) source1.Update() """ vtkImageCast 专门用于将 2D 或 3D 图像数据中每个像素的标量类型(如 int, float, unsigned char)转换为另一种类型 保证了数据的兼容性和精度 如果在整数计算中进行四舍五入或截断,每次乘法和加法都会损失精度,导致混合图像失真或出现明显的“阶梯”伪影 """ source1Double = vtkImageCast() source1Double.SetInputConnection(source1.GetOutputPort()) source1Double.SetOutputScalarTypeToDouble() # 创建第二幅图像 source2 = vtkImageSinusoidSource() source2.SetWholeExtent(0, 255, 0, 255, 0, 0) source2.Update() """ vtkImageWeightedSum 将多个输入图像(至少两个)根据用户指定的权重进行线性组合(加权求和),从而生成一个新的输出图像 """ sumFilter = vtkImageWeightedSum() sumFilter.SetWeight(0, 0.8) # 第0幅图像的权重 sumFilter.SetWeight(1, 0.2) # 第1幅图像的权重 sumFilter.AddInputConnection(source1Double.GetOutputPort()) sumFilter.AddInputConnection(source2.GetOutputPort()) sumFilter.Update() """ 在图像混合(加权求和)之后将数据类型转换为UnsignedChar,意味着每个像素都可以表示0到255之间的256中灰度级别 是为了可视化和渲染的需要 """ source1CastFilter = vtkImageCast() source1CastFilter.SetInputConnection(source1.GetOutputPort()) source1CastFilter.SetOutputScalarTypeToUnsignedChar() source1CastFilter.Update() source2CastFilter = vtkImageCast() source2CastFilter.SetInputConnection(source2.GetOutputPort()) source2CastFilter.SetOutputScalarTypeToUnsignedChar() source2CastFilter.Update() summedCastFilter = vtkImageCast() summedCastFilter.SetInputConnection(sumFilter.GetOutputPort()) summedCastFilter.SetOutputScalarTypeToUnsignedChar() summedCastFilter.Update() source1Actor = vtkImageActor() source1Actor.GetMapper().SetInputConnection(source1CastFilter.GetOutputPort()) source2Actor = vtkImageActor() source2Actor.GetMapper().SetInputConnection(source2CastFilter.GetOutputPort()) summedActor = vtkImageActor() summedActor.GetMapper().SetInputConnection(summedCastFilter.GetOutputPort()) renderWindow = vtkRenderWindow() renderWindow.SetSize(600, 300) # And one interactor interactor = vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) # ViewPort=[Xmin, Ymin, Xmax, Ymax] leftViewport = [0.0, 0.0, 0.33, 1.0] centerViewport = [0.33, 0.0, .66, 1.0] rightViewport = [0.66, 0.0, 1.0, 1.0] # Setup renderers leftRenderer = vtkRenderer() renderWindow.AddRenderer(leftRenderer) leftRenderer.SetViewport(leftViewport) leftRenderer.SetBackground(colors.GetColor3d('Peru')) centerRenderer = vtkRenderer() renderWindow.AddRenderer(centerRenderer) centerRenderer.SetViewport(centerViewport) centerRenderer.SetBackground(colors.GetColor3d('DarkTurquoise')) rightRenderer = vtkRenderer() renderWindow.AddRenderer(rightRenderer) rightRenderer.SetViewport(rightViewport) rightRenderer.SetBackground(colors.GetColor3d('SteelBlue')) leftRenderer.AddActor(source1Actor) centerRenderer.AddActor(source2Actor) rightRenderer.AddActor(summedActor) leftRenderer.ResetCamera() centerRenderer.ResetCamera() rightRenderer.ResetCamera() renderWindow.SetWindowName('ImageWeightedSum') renderWindow.Render() interactor.Start() if __name__ == '__main__': main()