news 2026/4/3 4:28:44

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 10:59:25

Linly-Talker支持中文语音输入输出吗?答案在这里

Linly-Talker 的中文语音交互能力解析 在智能客服、虚拟主播和在线教育日益普及的今天&#xff0c;用户不再满足于冷冰冰的文字回复。他们期待的是一个能“听懂”自己说话、“张嘴”回应&#xff0c;并带有自然表情的数字人助手。然而&#xff0c;要实现真正流畅的中文语音交互…

作者头像 李华
网站建设 2026/3/24 8:19:32

用Linly-Talker制作美食烹饪教学视频?餐饮IP孵化捷径

用Linly-Talker制作美食烹饪教学视频&#xff1f;餐饮IP孵化捷径 在短视频内容爆炸的今天&#xff0c;一个餐饮品牌想要脱颖而出&#xff0c;靠的早已不只是口味。用户刷一条“三分钟学会川味回锅肉”的视频&#xff0c;可能比看十篇图文菜谱更愿意点赞关注。可问题来了——真人…

作者头像 李华
网站建设 2026/3/28 15:50:26

Linly-Talker支持模型加密传输,防止中间人攻击

Linly-Talker 实现模型加密传输&#xff0c;构建可信数字人系统 在当前AI技术快速渗透各行各业的背景下&#xff0c;数字人已不再局限于娱乐或展示场景。从银行智能客服到医院导诊助手&#xff0c;再到政府政务大厅的虚拟接待员&#xff0c;实时交互式数字人正承担起越来越关键…

作者头像 李华
网站建设 2026/4/3 0:02:30

用Linly-Talker生成天气预报视频?气象服务智能化尝试

用Linly-Talker生成天气预报视频&#xff1f;气象服务智能化尝试 在每天清晨打开手机查看“今天要不要带伞”的背后&#xff0c;是一整套复杂而精密的气象数据处理流程。过去几十年里&#xff0c;这些信息最终呈现给公众的方式始终如一&#xff1a;演播厅里的主持人、提词器、剪…

作者头像 李华
网站建设 2026/4/3 0:02:30

数字人直播带货合规提醒:必须标明AI身份

数字人直播带货合规提醒&#xff1a;必须标明AI身份 在电商直播日益火热的今天&#xff0c;观众早已习惯了屏幕那头热情洋溢的主播。但你有没有想过&#xff0c;那个正在推荐面膜、讲解参数、激情喊“上链接”的“人”&#xff0c;可能根本不是真人&#xff1f;随着AI技术突飞猛…

作者头像 李华
网站建设 2026/4/2 23:59:22

Linly-Talker支持CUDA 11.8,新版NVIDIA驱动完美兼容

Linly-Talker 支持 CUDA 11.8&#xff1a;为何这一升级让数字人部署变得如此轻松&#xff1f; 在虚拟主播直播间里&#xff0c;一个由 AI 驱动的数字人正自然地讲解着新品功能&#xff0c;口型与语音完美同步&#xff0c;表情丰富且反应迅速。这背后并非昂贵的动作捕捉设备或复…

作者头像 李华