Curioso sobre diferenças de vtkMassProperties para VTK 5,04 e VTK 5.4.2
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 ??h3>
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.
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.