添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
深情的煎鸡蛋  ·  docker ...·  1 月前    · 
慷慨的排球  ·  [Ubuntu] bash: ...·  5 月前    · 

在Python中对VTU文件进行体素化处理

0 人关注

我怎样才能使所附的 替换代码0]。 ?理想情况下,我想定义区域 (xmin=-9, xmax=9) (ymin=-9, ymax=9) 以及像素的数量(例如每个方向的 (256,256) ),并将该区域提取到像素网格上并存储在文件中(填充空洞区域)。

VTUfile

以下是我将文件读入polyData的方法

import vtk
# Read the source file.
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName("internal.vtu")
reader.Update()  
polydata = reader.GetOutput()

我怎样才能将polydata转换成具有上述细节的文件?

1 个评论
@stovfl 谢谢,但那个帖子是不同的。这里我处理的是一个非结构化的网格VTK文件。我的问题还包括定义从vtu文件中提取数据的区域,还有gving像素的分辨率。它更多的是关于体素化(但在二维)。
python
pixel
vtk
Ashkan Rafiee
Ashkan Rafiee
发布于 2020-05-10
2 个回答
Nico Vuaille
Nico Vuaille
发布于 2020-05-11
已采纳
0 人赞同

Answer in pure VTK

You should use the vtkResampleToImage filter. https://vtk.org/doc/nightly/html/classvtkResampleToImage.html (该文档是面向C++的,但在Python中的方法是一样的。)

供你参考,你的阅读器的输出是一个vtkUnstructuredGrid对象。polydata是另一种用于三维表面对象的vtk数据集。更多信息请看这里。 https://lorensen.github.io/VTKExamples/site/VTKFileFormats/#dataset-format

import vtk
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName("/home/nicolas/Tmp/discourse/internal.vtu")
reader.Update()
toImage = vtk.vtkResampleToImage()
toImage.SetInputConnection(reader.GetOutputPort())
toImage.SetUseInputBounds(False)
toImage.SetSamplingDimensions(256,1,256)
toImage.SetSamplingBounds(-9, 9, -0.1, 0, -9, 9)
toImage.Update()
imageData = toImage.GetOutput()
imageData.GetPointData().SetActiveScalars("U")
# Visualization
mapper = vtk.vtkDataSetMapper()
mapper.SetInputConnection(toImage.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
renderer.AddActor(actor)
renderWindow.Render()
renderWindowInteractor.Start()
# Write to file 
writer = vtk.vtkXMLImageDataWriter()
writer.SetFileName(filename)
writer.SetInputData(imageData)
writer.Write()
    
有趣的是,我在vtkResampleToImage过滤器中得到 "浮点异常"。如果我设置SetSamplingDimensions(256,2,256),它就会工作,而且我不会得到你展示的图片中的红色像素。有什么想法吗?
哪个版本的VTK?我在新的9.0.0版本中没有这个问题。
I've got version 8.1.2
mmusy
mmusy
发布于 2020-05-11
0 人赞同

不知道这是否有帮助,我有一个类似的问题,使用 vtkplotter recently which might turn useful to you:

from vtkplotter import *
import numpy as np
g = load('internal.vtu')
g.pointColors("p", cmap='terrain')
pts = g.points()
field = g.getPointArray('U')
ars = Arrows(pts-field/5, pts+field/5, c='k')
zpr = np.linspace(-15,15, num=25)
probes = np.c_[np.zeros_like(zpr)-10, np.zeros_like(zpr), zpr]
str_lns = streamLines(g, probes, activeVectors='U', maxPropagation=60, lw=2)
str_lns.pointColors(cmap='jet')
str_lns.GetProperty().LightingOff()
str_lns.mapper().SetResolveCoincidentTopologyToPolygonOffset()
show(g, ars, Points(probes), str_lns, elevation=90)
vol = interpolateToVolume(g, dims=(50,2,50), bounds=(-9,9,0,0,-9,9))
# vol.imagedata() # retrieves the vtkImageData obj
lego = vol.legosurface(cmap='terrain')
show(lego, newPlotter=True, elevation=90)