python - Curioso acerca de las diferencias en vtkMassProperties para VTK 5.04 y VTK 5.4.2
3d (1)
Nunca antes había oído hablar de VTK , pero aquí va.
Lo bueno del software de código abierto es que puedes verificar el código fuente directamente. Mejor aún, si hay un navegador de control de versiones basado en la web, podemos hablar en línea de esta manera.
Veamos vtkMassProperties
en cuestión. 5.0.4 utiliza r1.28 y 5.4.2 usa r1.30. Aquí está la diferencia entre r1.28 y r.30 . La parte que puede afectar los cálculos de volumen es
vol[2] += (area * (double)u[2] * (double)zavg); // 5.0.4
vol[2] += (area * u[2] * zavg); // 5.4.2
y
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
pero todos los cambios se ven bien para mí.
Siguiente sospechoso son los vtkMarchingCubes
. Diferencia entre r1.1.6.1 y 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
y
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
De nuevo, están arreglando cosas en el casting, pero se ve bien.
También podría ver vtkImageThreshold
. Diferencia entre r1.50 y r1.52 .
lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2
Hay muchos más, pero todos están lanzando cosas.
Se vuelve más interesante con vtkTIFFReader
. Diferencia entre 1.51 y 1.63 . Como puede ver por la diferencia en los números de revisión, ha habido algún desarrollo en esta clase en comparación con otros. Aquí están los comentarios de checkin:
- ENH: agregue un nombre para escalares. Visible en Paraview.
- ENH: vtkDataArray ahora tiene una nueva superclase-vtkAbstractArray ...
- ENH: establezca el número predeterminado de sampels por píxel para los archivos que carecen de estos metadatos.
- ENH: Lee solo lo que necesitas.
- ENH: agregue compatibilidad con archivos TIFF multipágina
- ENH: imprimir ivars
- ERROR: TIFF Reader no contabilizó correctamente los datos codificados RLE. Además, ExecuteInformation sobrescribió el espaciado y el origen especificados por el usuario.
- ERROR: al leer beach.tif (del CVS VTKData actual), la imagen se cargaría al revés.
- ESTILO: s / OrientationTypeSpecifiedFlag / OriginSpecifiedFlag / g y s / OrientationTypeSpecifiedFlag / SpacingSpecifiedFlag / g
- ERROR: Reader no estaba manejando las extensiones correctamente.
- COMP: reparación de una advertencia.
- COMP: Deshacerse de una advertencia.
A partir de la cantidad de cambios que se realizaron en vtkTIFFReader, supongo que la diferencia de comportamiento proviene de allí. Por ejemplo, puede haber comenzado a reconocer su Tiff como un formato diferente y ha cambiado los valores de píxeles internos. Intente imprimir los valores de píxeles y vea si hay alguna diferencia. Si los valores de píxel han cambiado maxthres=81
puede ser demasiado alto.
Tengo una pequeña función VTK
python que calcula el volumen y el área de superficie de un objeto incrustado en una pila de imágenes TIFF
. Para leer los TIFF''s
en VTK
, he usado vtkTIFFReader
y vtkTIFFReader
procesado el resultado usando vtkImageThreshold
. Luego uso vtkMassProperties
para extraer el volumen y el área de superficie del objeto identificado después del umbral.
Con VTK-5.04
, esta función devuelve el valor correcto para una pila de prueba (3902 píxeles). Sin embargo, al usar VTK-5.4.2
la misma función devuelve un valor diferente (422 píxeles). ¿Alguien puede explicar esto?
Código
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()
Nota
Al probar VTK-5.4.2 y VTK-5.2.1, reduje un poco las cosas y creo que este comportamiento se introdujo entre las versiones 5.0.4 y 5.2.1.
Actualizar
Parece que en VTK-5.4.2, vtkTIFFReader ignora los valores xey establecidos en el método SetDataSpacing . En cambio, vtkTIFFReader está calculando el espacio de datos xey para la resolución informada por los archivos TIFF.