首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >好奇VTK 5.04和VTK 5.4.2的vtkMassProperties差异

好奇VTK 5.04和VTK 5.4.2的vtkMassProperties差异
EN

Stack Overflow用户
提问于 2009-06-08 23:06:31
回答 1查看 1.8K关注 0票数 5

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

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

代码

代码语言:javascript
复制
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方法中设置的x和y值。相反,vtkTIFFReader正在从TIFF文件报告的分辨率中计算x和y数据存储。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-13 08:03:05

我以前从未听说过VTK,但现在开始了。

开放源码软件的好处是你可以直接检查源代码。更好的是,如果有基于web的版本控制浏览器,我们可以在网上像这样谈论它。

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

代码语言:javascript
复制
vol[2] += (area * (double)u[2] * (double)zavg); // 5.0.4
vol[2] += (area * u[2] * zavg); // 5.4.2

代码语言:javascript
复制
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

但在我看来所有的变化都没问题。

下一个可疑的是vtkMarchingCubesr1.1.6.1和1.5之间的差异

代码语言:javascript
复制
self->UpdateProgress ((double) k / ((double) dims[2] - 1)); // 5.0.4
self->UpdateProgress (k / static_cast<double>(dims[2] - 1)); // 5.4.2

代码语言:javascript
复制
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

再一次,他们在修理铸造的东西,但看起来没问题。

还不如去看看vtkImageThresholdr1.50和r1.52之间的差异

代码语言:javascript
复制
lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2

还有更多,但他们都是演员的东西。

使用vtkTIFFReader会变得更有趣。1.51和1.63之间的差异。从修订数字的不同可以看出,与其他类相比,这个类有了一些发展。以下是签入的注释:

  • ENH:为标量添加一个名称。在帕拉维尤可见。
  • vtkDataArray现在有了一个新的超类- new抽象阵列.
  • ENH:为缺少此元数据的文件设置每个像素的默认采样数。
  • 只读你需要的东西。
  • ENH:添加多页TIFF文件支持
  • ENH:打印象牙
  • 错误: TIFF阅读器没有正确解释RLE编码的数据。此外,ExecuteInformation覆盖用户指定的间距和来源。
  • BUG:当读取beach.tif (从当前的CVS VTKData)时,图像将被倒装。
  • 风格: s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g和s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • 错误:阅读器没有正确地处理区段。
  • 修正警告。
  • 消除警告。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/967468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档