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()
相关推荐
leisoo809717 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan202217 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
金銀銅鐵19 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
Python大数据分析@21 小时前
使用大模型MCP采集数据,爬虫已经无门槛
python·网络爬虫
quantdash_cc1 天前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
65岁退休Coder1 天前
LangChain v1.3.4 笔记 - 07 补充:链式调用 LCEL
后端·python·langchain
卷无止境1 天前
FastAPI 部署在 Nginx 后面到底该怎么配
后端·python
半亩码田1 天前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#
Wzx1980121 天前
python沙箱和docker沙箱你选对了吗?
开发语言·python·docker
Python私教1 天前
签名 URL 刷新导致审批失效?别急着删掉所有 query
python·安全