当前位置: 首页 > news >正文

PolyDataContourToImageData 3D集合图像转换成等效3D二值图像

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①三维图形转换为3D体素数据


二:代码及注释

import math import vtkmodules.vtkRenderingOpenGL2 import vtkmodules.vtkInteractionStyle from vtkmodules.vtkFiltersSources import vtkSphereSource from vtkmodules.vtkFiltersCore import vtkCutter, vtkStripper from vtkmodules.vtkCommonDataModel import vtkImageData, vtkPlane from vtkmodules.vtkIOXML import vtkXMLPolyDataWriter from vtkmodules.vtkCommonCore import VTK_UNSIGNED_CHAR from vtkmodules.vtkFiltersModeling import vtkLinearExtrusionFilter from vtkmodules.vtkImagingStencil import vtkImageStencil, vtkPolyDataToImageStencil from vtkmodules.vtkIOImage import vtkMetaImageWriter, vtkPNGWriter def main(): # 创建一个3D图形 sphereSource = vtkSphereSource() sphereSource.SetPhiResolution(30) sphereSource.SetThetaResolution(30) sphereSource.SetCenter(40, 40, 40) sphereSource.SetRadius(20) # 切割数据集的"刀" # 首先先定义这个刀是什么,需要使用隐函数定义 cutPlane = vtkPlane() cutPlane.SetOrigin(sphereSource.GetCenter()) cutPlane.SetNormal(0, 0, 1) circleCutter = vtkCutter() circleCutter.SetInputConnection(sphereSource.GetOutputPort()) circleCutter.SetCutFunction(cutPlane) stripper = vtkStripper() stripper.SetInputConnection(circleCutter.GetOutputPort()) stripper.Update() circle = stripper.GetOutput() # 写入vtp文件 polyDataWriter = vtkXMLPolyDataWriter() polyDataWriter.SetInputData(circle) polyDataWriter.SetFileName("circle.vtp") polyDataWriter.SetCompressorTypeToNone() # 不适用任何压缩 polyDataWriter.SetDataModeToAscii() # 设置输出文件中的数据以ASCII(文本)格式存储 polyDataWriter.Write() # 准备一个体素数据 whiteImage = vtkImageData() bounds = [0] * 6 circle.GetBounds(bounds) spacing = [0.5, 0.5, 0.5] whiteImage.SetSpacing(spacing) # 计算这个体素数据的维度 dim = [0] * 3 for i in range(3): dim[i] = int(math.ceil((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i])) + 1 if dim[i] < 1: dim[i] = 1 whiteImage.SetDimensions(dim) # 算是设置了图像体素的数量 # SetExtent 设置了图像的索引范围 确保了生成的 3D 图像的体素网格是最小且精确的,既不浪费内存,又能完整地覆盖输入的几何体 whiteImage.SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1) origin_shift = 5 * 0.5 origin = [0] * 3 origin[0] = bounds[0] - origin_shift origin[1] = bounds[2] - origin_shift origin[2] = bounds[4] - origin_shift # 上述添加origin_shift是为了vtkImageData能够完全包裹住mesh whiteImage.SetOrigin(origin) # AllocateScalars # 为图像的体素数据分配内存。VTK_UNSIGNED_CHAR(无符号字符,范围 0-255),1 表示每个体素有一个分量(即灰度值) whiteImage.AllocateScalars(VTK_UNSIGNED_CHAR, 1) # 将 整个 3D 图像(体素网格)预先填充为前景值(即白色) # inval = 255 outval = 0 # count = whiteImage.GetNumberOfPoints() # for i in range(count): # whiteImage.GetPointData().GetScalars().SetTuple1(i, inval) # 上述for循环的简便替代方法 whiteImage.GetPointData().GetScalars().Fill(255) extrude = vtkLinearExtrusionFilter() extrude.SetInputData(circle) extrude.SetScaleFactor(1.0) # 设置挤压的比例因子 extrude.SetExtrusionTypeToVectorExtrusion() # 设置为向量挤压,而非几何体表面的法线定义 extrude.SetVector(0, 0, 1) # 设置挤压的向量 extrude.Update() pol2stenc = vtkPolyDataToImageStencil() pol2stenc.SetInputConnection(extrude.GetOutputPort()) pol2stenc.SetTolerance(0) # 帮助过滤垂直面 pol2stenc.SetOutputOrigin(origin) pol2stenc.SetOutputSpacing(spacing) pol2stenc.SetOutputWholeExtent(whiteImage.GetExtent()) pol2stenc.Update() imgstenc = vtkImageStencil() """ tkImageStencil 是另一个关键过滤器,它接收一个图像作为输入,并根据一个模板(Stencil)修改该图像的像素值。 """ imgstenc.SetInputData(whiteImage) imgstenc.SetStencilConnection(pol2stenc.GetOutputPort()) imgstenc.ReverseStencilOff() imgstenc.SetBackgroundValue(outval) imgstenc.Update() imageWriter = vtkMetaImageWriter() imageWriter.SetFileName('labelImage.mhd') imageWriter.SetInputConnection(imgstenc.GetOutputPort()) imageWriter.Write() imageWriter = vtkPNGWriter() imageWriter.SetFileName('labelImage.png') imageWriter.SetInputConnection(imgstenc.GetOutputPort()) imageWriter.Write() if __name__ == '__main__': main()
http://www.jsqmd.com/news/116297/

相关文章:

  • Linly-Talker语音重复检测:防止TTS输出异常循环
  • LLM 的思考方式
  • win10 黑屏,只剩鼠标箭头光标 按win键可以显示任务栏
  • 【LangChain4J】提示词工程
  • OpenAI官方论文“泄密”GPT-5:RL到底有没有教坏CoT?万字深度实测
  • PolyDataToImageDataStencil如何用多边形数据作为“模板”来裁剪或屏蔽图像数据
  • 【无功优化】基于改进遗传算法的电力系统无功优化研究【IEEE30节点】(Matlab代码实现)
  • 上海交大《科学》发文,首次实现支持大模型的全光计算芯片
  • Linly-Talker支持模型灰度发布,逐步上线新功能
  • Linly-Talker开源镜像部署指南(含GPU加速优化)
  • 考虑实时市场联动的电力零售商鲁棒定价策略(Matlab代码实现)
  • 用Linly-Talker制作节日祝福视频?个性化礼品新创意
  • 可计算性:物理世界和意识
  • 【无人机协同】动态环境下多无人机系统的协同路径规划与防撞研究(Matlab代码实现)​
  • Linly-Talker支持多线程推理,高并发场景从容应对
  • 用Linly-Talker生成股票行情分析视频?金融内容自动化
  • Linly-Talker如何处理中英文混读?语音识别适配策略
  • Linly-Talker支持模型热切换,A/B测试轻松实现
  • 【虚拟同步机控制建模】三相虚拟同步发电机双环控制(Simulink仿真实现)
  • 途知抖音多模态数据采集与AI融合解析
  • AI教师上岗记:Linly-Talker在K12教育中的实际效果测评
  • 人生的机会,从来不在计划之中?(说说我在百度的故事...)
  • 海南自由贸易港全岛封关首日,西门子能源在海南启动建设燃机总装基地及服务中心 | 美通社头条
  • Linly-Talker音频频谱可视化:调试语音合成质量的利器
  • 复星与比亚迪达成全球战略合作,引领“出行+度假“新生态
  • cesium126,230816,Ce for Ue 加载服务器上的地图(GeoServerWMS):
  • 用Linly-Talker生成旅游景点解说视频?文旅宣传新手段
  • Linly-Talker如何应对长文本输入?分段处理策略解析
  • Linly-Talker音频响度标准化,符合广电播出规范
  • 万字长文!关于AI绘图,一篇超详细的总结发布