PolyDataToImageDataStencil如何用多边形数据作为“模板”来裁剪或屏蔽图像数据

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①多边形数据裁剪(屏蔽)图像数据

二:代码及注释

python 复制代码
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkIOImage import vtkPNGReader
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkFiltersCore import vtkTriangleFilter
from vtkmodules.vtkImagingStencil import vtkPolyDataToImageStencil, vtkImageStencil
from vtkmodules.vtkCommonDataModel import vtkPlane
from vtkmodules.vtkFiltersCore import vtkCutter, vtkStripper, vtkImageAppend
from vtkmodules.vtkInteractionImage import vtkImageViewer
from vtkmodules.vtkRenderingCore import vtkRenderWindowInteractor


def main():
    fn = "Data/fullhead15.png"
    # 一:用球体集合裁剪图像
    reader = vtkPNGReader()
    reader.SetFileName(fn)
    """
    PNG图像明明是一个二维图像,为什么这里还能设置三个维度的间距?
    vtkPNGReader是一个二维图像读取器,单独读一个PNG,它会生成一个vtkImageData,Z维度的extent是常数
    Extent: (0, width-1, 0, height-1, 0, 0),也就是说它的 Z 范围只有一层(z=0),是 二维的 2D 图像切片

    那这里的1.5的含义是指,在单张图片的情况下,z_spacing只是被保留作元数据
    """
    reader.SetDataSpacing(0.8, 0.8, 1.5)
    reader.SetDataOrigin(0, 0, 0)  # 设置图像原点在坐标系中的位置

    sphere = vtkSphereSource()
    sphere.SetPhiResolution(12)
    sphere.SetPhiResolution(12)
    sphere.SetCenter(102, 102, 0)
    sphere.SetRadius(60)

    # 将球体sphere转换为三角形
    stripper = vtkTriangleFilter()
    stripper.SetInputConnection(sphere.GetOutputPort())

    """
    把球体的多边形网格 转换成一张图像掩膜(stencil mask),即:
    球体内部的像素 = 1(保留或删除)
    球体外部的像素 = 0(反向操作)
    """
    # 将polydata转换为图像模板,为之后的图像处理做准备
    dataToStencil = vtkPolyDataToImageStencil()
    dataToStencil.SetInputConnection(stripper.GetOutputPort())
    dataToStencil.SetOutputOrigin(0, 0, 0)
    dataToStencil.SetOutputSpacing(0.8, 0.8, 1.4)

    # 运用球体遮罩裁剪图像
    stencil = vtkImageStencil()
    stencil.SetInputConnection(reader.GetOutputPort())
    stencil.SetStencilConnection(dataToStencil.GetOutputPort())
    stencil.ReverseStencilOn()  # 反向裁剪,表示保留球体外部,挖掉球体内部
    stencil.SetBackgroundValue(500)  # 被挖掉的区域填充值为500

    # 二:用球体和平面切割出的轮廓裁剪图像
    reader2 = vtkPNGReader()
    reader2.SetFileName(fn)
    reader2.SetDataSpacing(0.8, 0.8, 1.5)
    reader2.SetDataOrigin(0.0, 0.0, 0.0)

    plane = vtkPlane()
    plane.SetOrigin(0, 0, 0)
    plane.SetNormal(0, 0, 1)
    cutter = vtkCutter()
    cutter.SetCutFunction(plane)
    cutter.SetInputConnection(sphere.GetOutputPort())

    stripper2 = vtkStripper()
    stripper2.SetInputConnection(cutter.GetOutputPort())
    dataToStencil2 = vtkPolyDataToImageStencil()
    dataToStencil2.SetInputConnection(stripper2.GetOutputPort())
    dataToStencil2.SetOutputSpacing(0.8, 0.8, 1.5)
    dataToStencil2.SetOutputOrigin(0.0, 0.0, 0.0)

    stencil2 = vtkImageStencil()
    stencil2.SetInputConnection(reader2.GetOutputPort())
    stencil2.SetStencilConnection(dataToStencil2.GetOutputPort())
    stencil2.SetBackgroundValue(500)

    imageAppend = vtkImageAppend()
    imageAppend.SetInputConnection(stencil.GetOutputPort())
    imageAppend.AddInputConnection(stencil2.GetOutputPort())

    interactor = vtkRenderWindowInteractor()

    viewer = vtkImageViewer()
    viewer.SetInputConnection(imageAppend.GetOutputPort())
    viewer.SetupInteractor(interactor)
    viewer.SetZSlice(0)  # 控制显示Z轴的第几层
    """
    参数    视觉效果
    增大 ColorWindow    提高对比范围,整体更"平"
    减小 ColorWindow    缩小对比范围,图像更"锐"
    增大 ColorLevel    图像整体变亮
    减小 ColorLevel    图像整体变暗
    """
    viewer.SetColorWindow(2000)  # 控制对比度范围
    viewer.SetColorLevel(1000)
    viewer.GetRenderWindow().SetWindowName('PolyDataToImageDataStencil')
    viewer.Render()

    interactor.Start()

if __name__ == '__main__':
    main()
相关推荐
用户0332126663675 分钟前
如何快速拆分超大 Excel 文件【Python 教程】
python·excel
kimnoic10 分钟前
Python中使用封装类还是函数以及它们的区别
开发语言·python
青柠之夏cc15 分钟前
Python Java PHP底层对比:内存并发性能全解析
开发语言·python·线程
TomEval15 分钟前
【测AI】第10篇:AI 模型功能测试实战 —— 测试用例怎么设计?
人工智能·python·功能测试·测试用例
半亩码田21 分钟前
C#转Python第5.1篇:异步编程:asyncio vs async/await,语法相似但机制不同
开发语言·python·c#
yi01124 分钟前
DAY27: LeetCode 110. 平衡二叉树 | 在递归中判断是否平衡
人工智能·笔记·python·算法·leetcode·二叉树·递归
言乐61 小时前
PythonLOLM自动生成复盘报告模型
开发语言·前端·数据库·人工智能·python
水水不水啊1 小时前
告别切换N个窗口调试:我用 Python + WebView 做了款现代化串口助手(含 TCP/UDP、波形、协议解析)
python·tcp/ip·udp
论文复现现场1 小时前
DeepSeek V4.1 Flash 各平台价格怎么比?缓存、峰谷计费与 Python 成本计算
开发语言·python·缓存·大模型·成本优化·deepseek
打工仔折腾 AI1 小时前
鸿蒙平板远控电脑实测:ToDesk蓝牙键鼠、双模式鼠标与跨端剪贴板落地记录
人工智能·后端·python·性能优化·计算机外设·电脑·harmonyos