好奇的关于差异vtkMassProperties为VTK5.04和VTK5.4.2
题
我有一个小的蟒蛇 VTK
功能,计算出体积和表面积的物体埋在一堆 TIFF
图像。阅读 TIFF's
入 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忽略了 x 和 y 值设置在 SetDataSpacing 法。而不是vtkTIFFReader是计算 x 和 y 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
可能太高。