VTK 5.04 및 VTK 5.4.2의 vtkmassproperties의 차이에 대해 궁금합니다.

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

  •  12-09-2019
  •  | 
  •  

문제

작은 파이썬이 있습니다 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 너무 높을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top