Neugierig auf Unterschiede in vtkMassProperties für VTK 5,04 und VTK 5.4.2
Frage
Ich habe ein kleines Python VTK
Funktion, die das Volumen und die Oberfläche eines Objekts in einem Stapel von TIFF
eingebettet berechnet Bilder. Um die TIFF's
in VTK
zu lesen, habe ich verwendet vtkTIFFReader
und das Ergebnis mit vtkImageThreshold
verarbeitet. Ich verwende vtkMassProperties
dann nach Schwellwertbildung identifiziert das Volumen und die Oberfläche des Objektes zu extrahieren.
Mit VTK-5.04
, gibt diese Funktion den richtigen Wert für einen Teststapel (3902 Pixel). Jedoch kehrt Verwendung VTK-5.4.2
die gleiche Funktion einen anderen Wert (422 Pixel). Kann man das jemand erklären?
Code
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()
Hinweis
sowohl VTK-5.4.2 Durch das Testen und VTK-5.2.1, verengte ich die Dinge ein wenig nach unten und glaube, dass dieses Verhalten zwischen den Versionen 5.0.4 und 5.2.1 eingeführt wurde.
Update
Es scheint, dass in VTK-5.4.2, vtkTIFFReader die ignoriert x und y eingestellten Werte in der SetDataSpacing Methode. Stattdessen wird vtkTIFFReader Berechnung der x und y aus der Auflösung durch die TIFF-Dateien berichtet dataspacing.
Lösung
Ich habe noch nie von VTK gehört, aber hier geht es.
Gute Sache über Open-Source-Software ist, dass Sie den Quellcode direkt überprüfen können. Noch besser wäre es, wenn es Web-basierte Version Control-Browser ist, können wir über es online so reden.
Lassen Sie uns sehen vtkMassProperties
Frage. 5.0.4 verwendet r1.28 und 5.4.2 verwendet r1.30. Hier ist der diff zwischen r1.28 und r.30 . Der Teil, der beeinflussen können Volumenberechnungen sind
vol[2] += (area * (double)u[2] * (double)zavg); // 5.0.4
vol[2] += (area * u[2] * zavg); // 5.4.2
und
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
aber alle Änderungen aussehen ok für mich.
Als nächstes verdächtig sind die vtkMarchingCubes
. Diff zwischen r1.1.6. 1 und 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
und
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
Auch sie sind Befestigungs Sachen beim Gießen, aber es sieht okay.
Es könnte aber auch sehen vtkImageThreshold
auch. Diff zwischen r1.50 und r1. 52 .
lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2
Es gibt Haufen mehr, aber sie sind alle Guss Zeug.
Es wird immer interessanter mit vtkTIFFReader
. Diff zwischen 1,51 und 1,63 . Wie Sie durch die Differenz in den Revisionsnummern sehen können, gibt es einige Entwicklung in dieser Klasse war im Vergleich zu anderen. Hier sind die checkin Kommentare:
- ENH: Fügen Sie einen Namen für Skalare. Sichtbar in Paraview.
- ENH: vtkDataArray hat jetzt ein neue übergeordneten Klasse-vtkAbstractArray ...
- ENH. Set Standardanzahl von sampels pro Pixel für Dateien, die diese Meta-Daten fehlen
- ENH. Lesen Sie nur, was Sie brauchen
- ENH: in mehrseitigen TIFF-Datei-Unterstützung
- ENH: print ivars
- BUG: TIFF Reader nicht richtig machen RLE codierten Daten. Auch ExecuteInformation überschrieb Benutzer angegebenen Abstand und Herkunft.
- BUG:. Wenn beach.tif (aus dem aktuellen CVS VTKData) zu lesen, würde das Bild auf dem Kopf geladen werden
- STYLE: s / OrientationTypeSpecifiedFlag / OriginSpecifiedFlag / g und s / OrientationTypeSpecifiedFlag / SpacingSpecifiedFlag / g
- BUG:. Reader wurde nicht Ausdehnungen richtig Handhabung
- COMP. Fixing eine Warnung
- COMP: Erste einer Warnung befreien.
Aus der Menge von Änderungen, die in vtkTIFFReader gemacht wurden, würde ich vermuten, dass der Unterschied im Verhalten von dort kommt. Zum Beispiel kann es Ihre Tiff als anderes Format zu erkennen und verändert die internen Pixelwerte haben begonnen. Versuchen Sie Pixelwerte Druck und sehen, ob es einen Unterschied ist. Wenn die Pixelwerte maxthres=81
haben sich geändert zu hoch sein.