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()
相关推荐
weixin_3077791320 分钟前
RAG 面试陷阱——混合检索并非无条件优越:一个条件反转实验
人工智能·python·面试·职场和发展
云和数据.ChenGuang1 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
荣码4 小时前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python
databook4 小时前
Pandas 与 Polars:语法、性能和资源占用方面的对比
python·数据分析·pandas
威哥爱编程5 小时前
Python 智能体开发实战 10:本地跑得好好的,一并发就崩?把它做成一个能上线的服务
python·agent
威哥爱编程5 小时前
Python 智能体开发实战 09:改了提示词,到底是变好还是变坏?搭一套能打分的离线评测
python·agent
meiying88385 小时前
多快递公司快递单号批量查询接口怎么对接?Python 聚合查询实现
java·大数据·python
Hello_Pyhx5 小时前
Deep-Live-Cam 源码配置思路:环境、模型与执行后端分开排查
python
张张123y6 小时前
后端第十六课:Multi-Agent 多智能体(让多个 Agent 分工协作)
大数据·数据库·人工智能·python·deepseek·dsh·agent 框架
全栈练习生6 小时前
大规模智能体仿真
python·ai