我有一个小的蟒蛇 VTK 功能,计算出体积和表面积的物体埋在一堆 TIFF 图像。阅读 TIFF'sVTK, 我有用 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忽略了 xy 值设置在 SetDataSpacing 法。而不是vtkTIFFReader是计算 xy dataspacing从该决议的报告TIFF文件。

有帮助吗?

解决方案

我从来没有听说过 VTK 之前,但这里它是。

好事有关开放源代码软件是,你可以检查的源码。更好的是,如果有的基于互联网的版本控制浏览器,我们可以谈论它在线这样的。

让我们来看看 vtkMassProperties 在问题。5.0.4使用r1。28、5.4.2使用r1。30.这里的 差异之间的r1。28和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. 差异之间的r1。1.6.1 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 太。 差异之间的r1。50和r1。52.

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

还有一堆更多,但它们都是铸造的东西。

它变得更加有趣 vtkTIFFReader. 差异之间的1.51和1.63.正如你可以看到的差别在修订数,已有一些发展在这类相比,其他人。在这里签评论:

  • 增:增加一个名为标量.可见在文件。
  • 增:vtkDataArray现在有一个新的超类-vtkAbstractArray...
  • 增:设定缺省数sampels每一像素的文件,缺少这种元数据。
  • 增:只读你需要什么。
  • 增:加页TIFF文件的支持
  • 增:印实例变量
  • 错误:TIFF阅读器没有正确账户的游程编码数据。此外,ExecuteInformation 复盖的用户指定的间隔和来源。
  • 错误:阅读时的海滩。tif(从目前的CVS VTKData),图像将被装载上下颠倒。
  • 风格:s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g和s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • 错误:读者不是处理范围正常。
  • COMP:固定的一个警告。
  • COMP:摆脱的一个警告。

从量的变化是在vtkTIFFReader,我猜想的行为差异是来自那里。例如,它可能已经开始认识到你的Tiff作为不同的格式,并改变内部的像素的价值。试试打印出来的像素的价值观,看看是否有任何差别。如果素值已经改变了 maxthres=81 可能太高。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top