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()
相关推荐
拿我格子衫来4 小时前
LaserWeb4:矢量图与位图如何变成 G-code
图像处理·图形渲染
傲笑风4 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架4 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
谢白羽8 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
迷迭香yy9 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
清水白石0089 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
️学习的小王10 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
前端 贾公子10 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步10 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
jayson.h10 小时前
PDF 合并+添加页码 相关库、类、函数
开发语言·前端·python