2016-02-25 151 views
1

我從一系列dicom圖像創建3D模型。我正在使用的工作流程如下:將python-vtk/three.js中的polydata模型的軸/軸心居中

  • 閱讀dicom系列文章vtkDICOMImageReader
  • vtkImageThreshold獲取卷的閾值圖像。
  • 使用Discrete Marching Cubes算法生成3D模型。
  • 使用vtkPLYWriter將輸出寫爲PLY文件。

當我使用meshlab查看層文件時,它看起來很喜歡this(從後面看)。

我面臨的問題是,軸/軸不在模型的中心。那麼有沒有辦法解決這個問題?我知道我需要使用vtkTransformfilter來做到這一點(我想,我可能是錯的),但我只是不知道如何。

我看過在他們的網站上給出的vtk示例,但是它沒有提供我想要的足夠的信息。我也在SO中搜索了其他問題,但其中大多數都使用vtkActors和渲染器,並沒有解決我所遇到的問題。

我使用的dicom套裝是從here

我也想知道它是否可以在Three.js中做到這一點,就像加載模型然後居中?

謝謝

+0

在網上搜索整個晚上之後,我可以在three.js中找到一個小問題。使用'THREE.GeometryUtils.center(geometry);'加載模型後,它會將它置於世界的中心,並且還會重置數據透視表。但我仍然想知道如何在vtk中重置它。 – dvenkatsagar

回答

2

如果它是確定移動的模型,那麼你可以定義模型的中心,並將其轉換爲全局原點,然後保存轉換模型作爲PLY文件。

首先,您要定義模型的中心。一個快速和骯髒的方式可以得到質量中心:

centerFilter = vtk.vtkCenterOfMass() 
centerFilter.SetInputData(polydata) 
centerFilter.SetUseScalarsAsWeights(False) 
centerFilter.Update() 
center = centerFilter.GetCenter() 

然後你想改變你的模型:

transform = vtk.vtkTransform() 
transform.Translate(-center[0], -center[1], -center[2]) 
transformFilter = vtk.vtkTransformPolyDataFilter() 
transformFilter.SetInputData(polydata) 
transformFilter.SetTransform(transform) 
transformFilter.Update() 
centeredPolydata = transformFilter.GetOutput() 

然後寫與centeredPolydata輸出PLY文件。

注意:這會使中心模型與圖像數據關聯更加困難。

+0

謝謝您的回覆,我會檢查出來的,謝謝。 – dvenkatsagar

+0

這確實奏效,謝謝。並在這裏留下評論:如果有人想用Three.js將對象居中,他們可以簡單地使用這個'THREE.GeometryUtils.center(geometry);'並且它會將它居中在瀏覽器屏幕上。 – dvenkatsagar

+0

yes對一個模型進行居中相當容易,sketchup有一個插件,可以從頂點數據編寫代碼,meshlab肯定有一個,這只是一個解決方案,如果您正在做大量的模型,那麼這個解決方案可以很好地適應您的工作流程,否則只要選擇任何程序即可。 –

-1

我可以使用vtkCenterOfMass與vtkImageReslice或vtkImageImport?