Pergunta

I têm um pequeno pitão VTK função que calcula o volume e a área de superfície de um objecto a incorporado em uma pilha de TIFF imagens. Para ler o TIFF's em VTK, tenho usado vtkTIFFReader e processados ??o resultado usando vtkImageThreshold. Uso então vtkMassProperties para extrair a área de volume e de superfície do objecto identificado, após o limiar.

Com VTK-5.04, esta função retorna o valor correto para uma pilha de teste (3902 pixels). No entanto, usando VTK-5.4.2 a mesma função retorna um valor diferente (422 pixels). Alguém pode explicar isso?


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

Ao testar as duas coisas VTK-5.4.2 e VTK-5.2.1, eu estreitada para baixo um pouco e acredito que este comportamento foi introduzido entre as versões 5.0.4 e 5.2.1.

Atualização

Parece que em VTK-5.4.2, vtkTIFFReader ignora o x e y valores definidos na SetDataSpacing método. Em vez vtkTIFFReader está calculando o x e y dataspacing da resolução relatada pelos arquivos TIFF.

Foi útil?

Solução

Eu nunca ouvi falar de VTK antes, mas aqui vai.

Boa coisa sobre software opensource é que você pode verificar o código-fonte diretamente. Melhor ainda, se há navegador controle de versão baseada na Web, podemos falar sobre isso on-line como este.

Vamos ver vtkMassProperties em questão. 5.0.4 usos r1.28 e 5.4.2 usos r1.30. Aqui está o diff entre r1.28 e R.30 . A parte que pode afetar os cálculos de volume são

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

mas todas as alterações olhar ok para mim.

A seguir suspeitos são o vtkMarchingCubes . Dif entre 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

Mais uma vez, eles são fixação coisas no elenco, mas parece ok.

Pode muito bem ver vtkImageThreshold também. Diff entre r1.50 e R1. 52 .

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

Existem bando mais, mas todos eles são coisas de qualidade.

Ele fica mais interessante com vtkTIFFReader . Dif entre 1,51 e 1,63 . Como você pode ver pela diferença nos números de revisão, tem havido algum desenvolvimento nesta classe em comparação com outros. Aqui estão os comentários Check-in:

  • ENH: Adicionar um nome para escalares. Visível na Paraview.
  • ENH: vtkDataArray tem agora uma nova superclasse-vtkAbstractArray ...
  • ENH:. Set número padrão de sampels por pixel para os arquivos que estão faltando essa meta dados
  • ENH:. Leia apenas o que você precisa
  • ENH: adicionar suporte a arquivos TIFF multipage
  • ENH: ivars de impressão
  • BUG: TIFF Reader não fez adequadamente representam RLE codificado dados. Além disso, ExecuteInformation user overwrote especificado espaçamento e origem.
  • Erro:. Ao ler beach.tif (do CVS atual VTKData), a imagem seria carregado de cabeça para baixo
  • STYLE: s / OrientationTypeSpecifiedFlag / OriginSpecifiedFlag / g e s / OrientationTypeSpecifiedFlag / SpacingSpecifiedFlag / g
  • Erro:. Reader não estava lidando com extensões corretamente
  • COMP:. A fixação de um aviso
  • COMP: Livrar-se de um aviso.

A partir da quantidade de mudanças que foi feito em vtkTIFFReader, eu acho que a diferença de comportamento está vindo de lá. Por exemplo, ele pode ter começado a reconhecer a sua TIFF como formato diferente e mudou os valores de pixel internos. Tente imprimir valores de pixel e ver se há alguma diferença. Se os valores de pixel mudaram maxthres=81 pode ser muito alto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top