Curioso acerca de las diferencias en vtkMassProperties para VTK 5.04 y VTK 5.4.2

StackOverflow https://stackoverflow.com/questions/967468

  •  12-09-2019
  •  | 
  •  

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top