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

Azi*_*zim 5 python 3d vtk

我有一个小的python 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()
Run Code Online (Sandbox Code Playgroud)

注意

通过测试VTK-5.4.2和VTK-5.2.1,我缩小了一点,并且相信这种行为是在5.0.4和5.2.1之间引入的.

更新

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

Eug*_*ota 5

我以前从来没有听说过VTK,但是它在这里.

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

让我们看看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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但所有的变化对我来说都没问题.

接下来是可疑的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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

同样,他们正在修复铸造的东西,但看起来还不错.

也可以看到vtkImageThreshold.r1.50和r1.52之间的差异.

lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2
Run Code Online (Sandbox Code Playgroud)

还有更多,但他们都是铸造的东西.

它变得更有趣了vtkTIFFReader.差异在1.51和1.63之间.正如您可以从修订版数量的差异中看到的那样,与其他类别相比,本课程有了一些发展.以下是签到评论:

  • ENH:为标量添加名称.在Paraview中可见.
  • ENH:vtkDataArray现在有了一个新的超类-vtkAbstractArray ......
  • ENH:为缺少此元数据的文件设置每像素的默认窗体数.
  • ENH:只读你需要的东西.
  • ENH:添加多页TIFF文件支持
  • ENH:打印ivars
  • BUG:TIFF Reader没有正确计算RLE编码数据.此外,ExecuteInformation覆盖了用户指定的间距和原点.
  • BUG:当读取beach.tif(从当前的CVS VTKData)时,图像将被颠倒加载.
  • STYLE:s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g和s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • BUG:Reader没有正确处理扩展区.
  • COMP:修正警告.
  • COMP:摆脱警告.

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