我是 VTK 的新手,我正在尝试从2个网格开始计算骰子相似系数(DSC)。
DSC可以计算为2 Vab / (Va + Vb)
,其中Vab
是网格A和网格B之间的重叠体积。
要读取网格(即使用3D切片器导出的.vtk格式的器官轮廓,https://www.slicer.org),我使用以下代码段:
string inputFilename1 = "organ1.vtk";
// Get all data from the file
vtkSmartPointer<vtkGenericDataObjectReader> reader1 = vtkSmartPointer<vtkGenericDataObjectReader>::New();
reader1->SetFileName(inputFilename1.c_str());
reader1->Update();
vtkSmartPointer<vtkPolyData> struct1 = reader1->GetPolyDataOutput();
我可以使用vtkMassProperties
计算两个网格的体积(虽然我观察到用VTK计算的数据与使用3D切片计算的数据之间存在一些差异)。
然后交叉2个网格,我正在尝试使用vtkIntersectionPolyDataFilter
。但是,此过滤器的输出是一组行,用于标记输入vtkPolyData
对象的交集,而不是封闭的表面。因此,我需要以某种方式从这些线生成网格并计算其体积。
你知道哪种方法可以很好,准确地生成这样的网格以及如何做到这一点?
或者,我也尝试使用 ITK 。我找到了一个应该处理这个问题的软件包(http://www.insight-journal.org/browse/publication/762,日期为2010年),但是我无法针对最新版本的ITK进行编译。它说ITK必须使用(现已弃用)ITK_USE_REVIEW
标志ON
进行编译。毋庸置疑,我将新Module_ITKReview
设置为ON
进行编译,并且向后兼容,但没有运气。
最后,如果您有任何其他替代(可编写脚本)的软件/库来解决此问题,请告诉我。我需要自动执行这些计算。
答案 0 :(得分:1)
您可以尝试vtkBooleanOperationPolyDataFilter
http://www.vtk.org/doc/nightly/html/classvtkBooleanOperationPolyDataFilter.html
filter->SetOperationToIntersection();
如果您的数据流畅且表现良好,则此过滤器效果非常好。然而,尖锐的结构,例如,源于二进制图像行进立方体算法的算法可能会产生问题。也就是说,vtkPolyDataToImageStencil
在这方面并不一定表现得更好。
我曾经有过这样的印象:多边形上的布尔运算并不适用于&#34; organ&#34;大小100k多边形和更多。取决于。
答案 1 :(得分:0)
如果你想计算骰子相似系数,我建议你首先使用vtkPolyDataToImageStencil从网格中生成体积(栅格化)。 然后,计算DSC很容易。
祝你好运:)