VTK 5.04 と VTK 5.4.2 の vtkMassProperties の違いについて知りたい
質問
小さなニシキヘビを飼っています 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 は バツ そして y に設定された値 SetDataSpacing 方法。代わりに、vtkTIFFReader は バツ そして y TIFF ファイルによって報告される解像度からのデータスペース。
解決
聞いたことがない 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
繰り返しますが、彼らはキャストに関する問題を修正していますが、問題ないようです。
見てもいいかもしれません 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 が追加されました...
- 英語:このメタデータが欠落しているファイルのピクセルあたりのデフォルトのサンプル数を設定します。
- 英語:必要なものだけをお読みください。
- 英語:複数ページの TIFF ファイルのサポートを追加
- 英語:アイヴァールを印刷する
- バグ:TIFF Reader は、RLE エンコードされたデータを適切に考慮しませんでした。また、ExecuteInformationは、ユーザーが指定した間隔と原点を上書きしました。
- バグ:beach.tif (現在の CVS VTKData から) を読み取るときに、イメージが上下逆にロードされます。
- スタイル:s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g および s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
- バグ:Reader はエクステントを適切に処理していませんでした。
- コンプ:警告を修正します。
- コンプ:警告を取り除く。
vtkTIFFReader で行われた変更の量から、動作の違いはそこから来ていると推測します。たとえば、Tiff が別の形式として認識され始め、内部ピクセル値が変更された可能性があります。ピクセル値を印刷して、違いがあるかどうかを確認してください。ピクセル値が変化した場合 maxthres=81
高すぎるかもしれません。