VTK 5.04 및 VTK 5.4.2의 vtkmassproperties의 차이에 대해 궁금합니다.
문제
작은 파이썬이 있습니다 VTK
스택에 포함 된 물체의 부피와 표면적을 계산하는 기능 TIFF
이미지. 읽기 위해 TIFF's
~ 안으로 VTK
, 나는 사용했다 vtkTIFFReader
결과를 사용하여 처리했습니다 vtkImageThreshold
. 그런 다음 사용합니다 vtkMassProperties
임계 값 후 식별 된 물체의 부피 및 표면적을 추출합니다.
와 함께 VTK-5.04
,이 함수는 테스트 스택 (3902 픽셀)의 올바른 값을 반환합니다. 그러나 사용 VTK-5.4.2
동일한 함수는 다른 값 (422 픽셀)을 반환합니다. 누군가 이것을 설명 할 수 있습니까?
암호
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()
메모
VTK-5.4.2와 VTK-5.2.1을 모두 테스트함으로써, 나는 물건을 약간 좁히고이 동작이 버전 5.0.4와 5.2.1 사이에 도입되었다고 생각합니다.
업데이트
VTK-5.4.2에서 vtktiffReader는 그것을 무시하는 것 같습니다 엑스 그리고 와이 값에 설정된 값 setdataspacing 방법. 대신 vtktiffReader는 다음을 계산합니다 엑스 그리고 와이 TIFF 파일에 의해보고 된 해상도에서 데이터를 데이터에 맞게.
해결책
나는 들어 본 적이 없다 VTK 전에, 그러나 여기에 간다.
OpenSource 소프트웨어의 좋은 점은 소스 코드를 직접 확인할 수 있다는 것입니다. 더 좋은 점은 웹 기반 버전 컨트롤 브라우저가 있다면 이와 같이 온라인으로 이야기 할 수 있습니다.
보자 vtkMassProperties
문제의. 5.0.4는 R1.28을 사용하고 5.4.2는 R1.30을 사용합니다. 여기에 있습니다 R1.28과 R.30 사이의 차이. 볼륨 계산에 영향을 줄 수있는 부분은 다음과 같습니다
vol[2] += (area * (double)u[2] * (double)zavg); // 5.0.4
vol[2] += (area * u[2] * zavg); // 5.4.2
그리고
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
그러나 모든 변화는 나에게 괜찮아 보입니다.
다음 의심은 vtkMarchingCubes
. R1.1.6.1과 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
그리고
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
다시, 그들은 캐스팅에 물건을 고치고 있지만 괜찮아 보입니다.
아마 볼 수 있습니다 vtkImageThreshold
도. R1.50과 R1.52 사이의 차이.
lowerThreshold = (IT) inData->GetScalarTypeMin(); // 5.0.4
lowerThreshold = static_cast<IT>(inData->GetScalarTypeMin()); // 5.4.2
더 많은 사람들이 있지만, 그들은 모두 캐스팅하는 것입니다.
더 흥미로워집니다 vtkTIFFReader
. 1.51과 1.63 사이의 차이. 개정 번호의 차이에서 볼 수 있듯이이 클래스에서는 다른 사람들에 비해 약간의 발전이있었습니다. Checkin 의견은 다음과 같습니다.
- 향상 : 스칼라의 이름을 추가하십시오. Paraview에서 볼 수 있습니다.
- Enh : VtkdataArray 이제 새로운 슈퍼 클래스 VtkabstractArray가 있습니다 ...
- Enh :이 메타 데이터가 누락 된 파일에 대해 픽셀 당 기본 수의 sampel을 설정하십시오.
- Enh : 필요한 것을 읽으십시오.
- Enh : Multipage TIFF 파일 지원을 추가하십시오
- 향상 : 인쇄 이바
- 버그 : TIFF 리더는 RLE 인코딩 된 데이터를 제대로 설명하지 않았습니다. 또한 executeInformation은 사용자 지정된 간격 및 원점을 덮어 씁니다.
- 버그 : Beach.tif (현재 CVS vtkdata)를 읽을 때 이미지가 거꾸로로드됩니다.
- 스타일 : S/OrientationTyPescifiedFlag/OriginsPecifiedFlag/G 및 S/OrientationTyPescifiedFlag/spacingspecifiedflag/g
- 버그 : 독자는 적절하게 범위를 처리하지 않았습니다.
- comp : 경고 수정.
- COMP : 경고를 제거합니다.
vtktiffReader에서 이루어진 변화의 양에서, 나는 행동의 차이가 거기에서 나오고 있다고 생각합니다. 예를 들어, TIFF를 다른 형식으로 인식하고 내부 픽셀 값을 변경하기 시작했을 수 있습니다. 픽셀 값을 인쇄하고 차이가 있는지 확인하십시오. 픽셀 값이 변경된 경우 maxthres=81
너무 높을 수 있습니다.