Domanda

Ho un piccolo pitone VTK funzione che calcola il volume e la superficie di un oggetto incorporato in una pila di TIFF immagini.Per leggere il TIFF's in VTK, Ho usato vtkTIFFReader ed elaborato il risultato utilizzando vtkImageThreshold.Quindi uso vtkMassProperties per estrarre il volume e la superficie dell'oggetto identificato dopo la soglia.

Con VTK-5.04, questa funzione restituisce il valore corretto per uno stack di prova (3902 pixel).Tuttavia, utilizzando VTK-5.4.2 la stessa funzione restituisce un valore diverso (422 pixel).Qualcuno può spiegarlo?


Codice

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

Testando sia VTK-5.4.2 che VTK-5.2.1, ho ristretto un po' il campo e credo che questo comportamento sia stato introdotto tra le versioni 5.0.4 e 5.2.1.

Aggiornamento

Sembra che in VTK-5.4.2, vtkTIFFReader ignori il X E valori impostati in ImpostaSpaziaturaDati metodo.Invece vtkTIFFReader sta calcolando il file X E dataspacing dalla risoluzione riportata dai file TIFF.

È stato utile?

Soluzione

Non ne ho mai sentito parlare VTK prima, ma eccolo qui.

L'aspetto positivo del software open source è che puoi controllare direttamente il codice sorgente.Meglio ancora, se esiste un browser per il controllo della versione basato sul web, possiamo parlarne online in questo modo.

Vediamo vtkMassProperties in questione.5.0.4 utilizza r1.28 e 5.4.2 utilizza r1.30.Ecco il differenza tra r1.28 e r.30.La parte che può influenzare i calcoli del volume è

vol[2] += (area * (double)u[2] * (double)zavg); // 5.0.4
vol[2] += (area * u[2] * zavg); // 5.4.2

E

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

ma tutte le modifiche mi sembrano ok.

I successivi sospetti sono i vtkMarchingCubes. Differenza tra r1.1.6.1 e 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

E

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

Ancora una volta, stanno sistemando alcune cose sul casting, ma sembra ok.

Tanto vale vedere vtkImageThreshold pure. Differenza tra r1.50 e r1.52.

lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2

Ce ne sono molti altri, ma sono tutti roba da casting.

Diventa più interessante con vtkTIFFReader. Differenza tra 1,51 e 1,63.Come puoi vedere dalla differenza nei numeri di revisione, c'è stato qualche sviluppo in questa classe rispetto ad altre.Ecco i commenti del check-in:

  • ENH:Aggiungi un nome per gli scalari.Visibile in Paraview.
  • ENH:vtkDataArray ora ha una nuova superclasse-vtkAbstractArray...
  • ENH:Imposta il numero predefinito di campioni per pixel per i file a cui mancano questi metadati.
  • ENH:Leggi solo quello che ti serve.
  • ENH:aggiungere il supporto per file TIFF multipagina
  • ENH:stampa ivar
  • INSETTO:TIFF Reader non tiene conto correttamente dei dati codificati RLE.Inoltre, l'esecuzione di INFORMAZIONE ha sovrascritto la spaziatura e l'origine specificate dall'utente.
  • INSETTO:durante la lettura di beach.tif (dall'attuale CVS VTKData), l'immagine verrebbe caricata capovolta.
  • STILE:s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g e s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • INSETTO:Reader non gestiva correttamente le estensioni.
  • COMP:Correzione di un avviso.
  • COMP:Sbarazzarsi di un avvertimento.

Dalla quantità di modifiche apportate a vtkTIFFReader, immagino che la differenza di comportamento provenga da lì.Ad esempio, potrebbe aver iniziato a riconoscere il tuo Tiff come formato diverso e aver modificato i valori dei pixel interni.Prova a stampare i valori dei pixel e verifica se c'è qualche differenza.Se i valori dei pixel sono cambiati maxthres=81 potrebbe essere troppo alto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top