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()
相关推荐
冷雨夜中漫步6 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
喵手8 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934738 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy8 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威9 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ10 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha10 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
abluckyboy10 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法