Любопытно о различиях в vtkMassProperties для VTK 5.04 и VTK 5.4.2 - PullRequest
5 голосов
/ 09 июня 2009

У меня есть маленькая функция Python 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 игнорирует значения x и y , установленные в методе SetDataSpacing . Вместо этого vtkTIFFReader вычисляет интервалы данных x и y на основе разрешения, указанного в файлах TIFF.

1 Ответ

5 голосов
/ 13 июня 2009

Раньше я никогда не слышал о VTK , но вот оно.

Хорошая особенность программного обеспечения с открытым исходным кодом заключается в том, что вы можете напрямую проверять исходный код. Еще лучше, если есть веб-браузер контроля версий, мы можем поговорить об этом в Интернете следующим образом.

Давайте посмотрим 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 . Как вы можете видеть по разнице номеров ревизий, в этом классе произошли некоторые изменения по сравнению с другими. Вот комментарии о регистрации:

  • ENH: добавить имя для скаляров. Видна в Paraview.
  • ENH: теперь в vtkDataArray появился новый суперкласс-vtkAbstractArray ...
  • ENH: установить количество образцов по умолчанию на пиксель для файлов, в которых отсутствуют эти метаданные.
  • ENH: читайте только то, что вам нужно.
  • ENH: добавить поддержку многостраничного файла TIFF
  • ENH: печать иваров
  • BUG: TIFF Reader неправильно учел данные, закодированные RLE. Также, ExecuteInformation перезаписал указанный пользователем интервал и происхождение.
  • BUG: при чтении beach.tif (из текущих CVS VTKData) изображение загружается вверх ногами.
  • STYLE: s / OrientationTypeSpecifiedFlag / OriginSpecifiedFlag / g и s / OrientationTypeSpecifiedFlag / SpacingSpecifiedFlag / g
  • BUG: Reader неправильно обрабатывал экстенты.
  • COMP: Исправление предупреждения.
  • COMP: Избавиться от предупреждения.

Из количества изменений, которые были сделаны в vtkTIFFReader, я бы предположил, что разница в поведении исходит оттуда. Например, он мог начать распознавать ваш Tiff как другой формат и изменить значения внутреннего пикселя. Попробуйте распечатать значения пикселей и посмотрите, есть ли разница. Если значения пикселей изменились, maxthres=81 может быть слишком высоким.

...