5

VTK画像のスタックに埋め込まれたオブジェクトの体積と表面積を計算する小さなPython関数があり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はSetDataSpacingメソッドで設定されたx値とy値を無視しているようです。代わりに、vtkTIFFReaderは、TIFFファイルによって報告された解像度からxおよびyデータ間隔を計算しています。

4

1 に答える 1

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

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

繰り返しますが、彼らはキャストに関する問題を修正していますが、問題ないようです。

こちらも見た方がいいかもvtkImageThresholdr1.50 と r1.52 の違い

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

他にもたくさんありますが、それらはすべてキャストのものです。

でさらに面白くなりvtkTIFFReaderます。1.51 と 1.63 の差。リビジョン番号の違いからわかるように、このクラスは他のクラスと比較していくつかの開発が行われています。チェックインのコメントは次のとおりです。

  • ENH: スカラーの名前を追加します。Paraview で表示されます。
  • ENH: vtkDataArray に新しい superclass-vtkAbstractArray が追加されました...
  • ENH: このメタ データが欠落しているファイルに対して、ピクセルあたりのデフォルトのサンプル数を設定します。
  • ENH: 必要なものだけを読んでください。
  • ENH: マルチページ TIFF ファイルのサポートを追加
  • ENH: ivar を印刷
  • BUG: TIFF リーダーは、RLE エンコード データを適切に考慮していませんでした。また、ExecuteInformation は、ユーザーが指定した間隔と原点を上書きしました。
  • バグ: beach.tif (現在の CVS VTKData から) を読み取ると、画像が上下逆に読み込まれます。
  • スタイル: s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g および s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • BUG: Reader がエクステントを適切に処理していませんでした。
  • COMP: 警告を修正。
  • COMP: 警告を取り除きます。

vtkTIFFReader で行われた変更の量から、動作の違いはそこから来ていると推測できます。たとえば、Tiff が別の形式として認識され始め、内部のピクセル値が変更された可能性があります。ピクセル値を印刷してみて、違いがあるかどうかを確認してください。ピクセル値が変更された場合は、maxthres=81高すぎる可能性があります。

于 2009-06-13T08:03:05.090 に答える