Curioso acerca de las diferencias en vtkMassProperties para VTK 5.04 y VTK 5.4.2
Pregunta
Tengo una pequeña python VTK
función que calcula el área de superficie y volumen de un objeto incrustado en una pila de TIFF
imágenes.Para leer el TIFF's
en VTK
, He utilizado vtkTIFFReader
y se procesa el resultado de usar vtkImageThreshold
.Luego uso vtkMassProperties
para extraer el volumen y la superficie del objeto identificado después de umbralización.
Con VTK-5.04
, esta función devuelve el valor correcto para una prueba de la pila (3902 píxeles).Sin embargo, el uso de 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
Por el análisis de ambos VTK-5.4.2 y VTK-5.2.1, reduje las cosas un poco, y creo que este comportamiento se introdujo entre la versión 5.0.4 y 5.2.1.
Actualización
Parece que en VTK-5.4.2, vtkTIFFReader ignora la x y y los valores establecidos en el SetDataSpacing método.En lugar vtkTIFFReader es el cálculo de la x y y dataspacing de la resolución presentada por los archivos TIFF.
Solución
Nunca he oído hablar de VTK antes, pero aquí va.
La buena cosa sobre el software opensource es que usted puede comprobar el código fuente directamente.Mejor aún, si no basado en la web de control de la versión del navegador, podemos hablar de él en línea como este.
Vamos a ver vtkMassProperties
en la pregunta.5.0.4 utiliza r1.28 y 5.4.2 utiliza r1.30.Aquí está el diff entre r1.28 y r.30.La parte que puede afectar a los cálculos de volumen son
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í.
El próximo sospechosos son los vtkMarchingCubes
. Diff 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, son la fijación de material de fundición, pero se ve bien.
Así se podría ver vtkImageThreshold
demasiado. Diff entre r1.50 y r1.52.
lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2
Hay muchísimas más, pero todos ellos son de fundición de cosas.
Se pone más interesante con vtkTIFFReader
. Diff entre 1.51 y 1,63.Como se puede ver por la diferencia en los números de revisión, ha habido algo de desarrollo en esta clase en comparación con los demás.Aquí están las checkin comentarios:
- ENH:Agregar un nombre para escalares.Visible en Paraview.
- ENH:vtkDataArray ahora tiene una nueva superclase-vtkAbstractArray...
- ENH:Establecer número predeterminado de sampels por píxel para los archivos que faltan este tipo de metadatos.
- ENH:Leer sólo lo que usted necesita.
- ENH:agregar archivo TIFF de varias páginas de apoyo
- ENH:imprimir ivars
- ERROR:TIFF Lector no cuenta adecuadamente para RLE los datos codificados.También, ExecuteInformation sobrescribió usuario especifica el espaciado y el origen.
- ERROR:cuando la lectura de la playa.tif (de la actual CVS VTKData), la imagen sería cargado al revés.
- ESTILO:s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g y s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
- ERROR:El lector no era el manejo de las extensiones correctamente.
- COMP:La fijación de un aviso.
- COMP:Deshacerse de una advertencia.
A partir de la cantidad de cambios que se hizo en vtkTIFFReader, me imagino que la diferencia en el comportamiento es de allí.Por ejemplo, puede haber empezado a reconocer su Tiff como formato diferente y cambió la interna de los valores de los píxeles.Trate de imprimir los valores de los píxeles y ver si hay alguna diferencia.Si los valores de los píxeles han cambiado maxthres=81
puede ser demasiado alto.