gpt4 book ai didi

python - 对 VTK 5.04 和 VTK 5.4.2 的 vtkMassProperties 差异感到好奇

转载 作者:太空狗 更新时间:2023-10-30 01:10:40 25 4
gpt4 key购买 nike

我有一条小 python VTK计算嵌入在 TIFF 图像堆栈中的对象的体积和表面积的函数。为了将 TIFF 的 读入 VTK,我使用了 vtkTIFFReader 并使用 vtkImageThreshold 处理了结果。然后,我使用 vtkMassProperties 提取阈值处理后识别的对象的体积和表面积。

VTK-5.04 中,此函数返回测试堆栈的正确值(3902 像素)。但是,使用 VTK-5.4.2 相同的函数返回不同的值(422 像素)。谁能解释一下?


代码

def testvtk():
# read 36 TIFF images. Each TIFF is 27x27 pixels
v16=vtk.vtkTIFFReader()
v16.SetFilePrefix("d:/test/slice")
v16.SetDataExtent(0,27,0,27,1,36)
v16.SetFilePattern("%s%04d.tif")
v16.SetDataSpacing (1,1,1)
v16.Update()

# Threshold level for seperating background/foreground pixels
maxthres=81

# Threshold the image stack
thres=vtk.vtkImageThreshold()
thres.SetInputConnection(v16.GetOutputPort())
thres.ThresholdByLower(0)
thres.ThresholdByUpper(maxthres)

# create ISO surface from thresholded images
iso=vtk.vtkImageMarchingCubes()
iso.SetInputConnection(thres.GetOutputPort())

# Have VTK calculate the Mass (volume) and surface area
Mass = vtk.vtkMassProperties()
Mass.SetInputConnection(iso.GetOutputPort())
Mass.Update()

# just print the results
print "Volume = ", Mass.GetVolume()
print "Surface = ", Mass.GetSurfaceArea()

注意事项

通过测试 VTK-5.4.2 和 VTK-5.2.1,我缩小了一些范围,并相信此行为是在版本 5.0.4 和 5.2.1 之间引入的。

更新

似乎在 VTK-5.4.2 中,vtkTIFFReader 忽略了 SetDataSpacing 方法中设置的 xy 值。相反,vtkTIFFReader 根据 TIFF 文件报告的分辨率计算 xy 数据空间。

最佳答案

我从未听说过VTK之前,但在这里。

开源软件的好处是你可以直接查看源代码。更好的是,如果有基于 Web 的版本控制浏览器,我们可以像这样在线讨论它。

让我们看看vtkMassProperties有问题。 5.0.4 使用 r1.28,5.4.2 使用 r1.30。这是 diff between r1.28 and r.30 .可能影响体积计算的部分是

vol[2] += (area * (double)u[2] * (double)zavg); // 5.0.4
vol[2] += (area * u[2] * zavg); // 5.4.2

kxyz[0] = (munc[0] + (wxyz/3.0) + ((wxy+wxz)/2.0)) /(double)(numCells); // 5.0.4
kxyz[0] = (munc[0] + (wxyz/3.0) + ((wxy+wxz)/2.0)) /numCells; // 5.4.2

但我认为所有更改都正常。

下一个可疑的是 vtkMarchingCubes . Diff between r1.1.6.1 and 1.5 .

self->UpdateProgress ((double) k / ((double) dims[2] - 1)); // 5.0.4
self->UpdateProgress (k / static_cast<double>(dims[2] - 1)); // 5.4.2

estimatedSize = (int) pow ((double) (dims[0] * dims[1] * dims[2]), .75); // 5.0.4
estimatedSize = static_cast<int>(
pow(static_cast<double>(dims[0]*dims[1]*dims[2]),0.75)); // 5.4.2

同样,他们正在修复类型转换问题,但看起来还不错。

不妨看看vtkImageThreshold也。 Diff between r1.50 and r1.52 .

lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2

还有很多,但他们都是 Actor 。

vtkTIFFReader 变得更有趣了. Diff between 1.51 and 1.63 .从修订号的差异可以看出,与其他类(class)相比,该类(class)有了一些发展。以下是签到评论:

  • ENH:为标量添加一个名称。在 Paraview 中可见。
  • ENH:vtkDataArray 现在有一个新的父类(super class) - vtkAbstractArray...
  • ENH:为缺少此元数据的文件设置默认的每像素采样数。
  • ENH:只读你需要的。
  • ENH:添加多页 TIFF 文件支持
  • ENH:打印ivars
  • BUG:TIFF 阅读器没有正确解释 RLE 编码数据。另外,ExecuteInformation覆盖了用户指定的间距和原点。
  • BUG:当读取 beach.tif(来自当前 CVS VTKData)时,图像将被颠倒加载。
  • 样式:s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g 和 s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • BUG:Reader 没有正确处理范围。
  • COMP:修复警告。
  • COMP:摆脱警告。

从 vtkTIFFReader 中所做的更改量来看,我猜想行为上的差异来自那里。例如,它可能已经开始将您的 Tiff 识别为不同的格式并更改了内部像素值。尝试打印出像素值,看看是否有任何差异。如果像素值发生变化,maxthres=81 可能太高。

关于python - 对 VTK 5.04 和 VTK 5.4.2 的 vtkMassProperties 差异感到好奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/967468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com