想知道VTK 5.04和VTK 5.4.2的vtkMassProperties差异吗

2024-09-22 16:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


eh3代码>
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似乎忽略了在setdataspace方法中设置的xy值。相反,vtkTIFFReader正在根据TIFF文件报告的分辨率计算xy的数据间距。在


Tags: the对象函数堆栈isomassprintvtk
1条回答
网友
1楼 · 发布于 2024-09-22 16:28:57

我以前从来没听说过VTK,不过现在说了。在

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

让我们看看有问题的^{}。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

以及

^{pr2}$

但我觉得所有的改变都没问题。在

下一个可疑的是^{}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

再次,他们正在修复铸件,但看起来还不错。在

不妨也看看^{}Diff between r1.50 and r1.52。在

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

还有很多,但都是演员。在

使用^{}会更有趣。Diff between 1.51 and 1.63。从修订号的不同可以看出,这个类与其他类相比有了一些发展。以下是签入注释:

  • 名称:添加。在副视图中可见。在
  • ENH:vtkDataArray现在有了一个新的超类vtkAbstractArray。。。在
  • ENH:为丢失元数据的文件设置默认的每像素采样数。在
  • 恩:只读你需要的东西。在
  • ENH:添加多页TIFF文件支持
  • ENH:打印IVAR
  • 错误:TIFF阅读器没有正确解释RLE编码的数据。另外,执行信息 覆盖用户指定的间距和原点。在
  • 错误:阅读时海滩.tif(根据当前的cvsvtkdata),图像将被倒置加载。在
  • 样式:s/OrientationTypeSpecifiedFlag/g和s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • 错误:读取器未正确处理区段。在
  • 补偿:修复警告。在
  • 补偿:摆脱警告。在

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

相关问题 更多 >