Любопытно узнать о различиях в vtkMassProperties для VTK 5.04 и VTK 5.4.2.

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.

Это было полезно?

Решение

Я никогда не слышал о ВТК раньше, но вот оно.

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

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

  • ЭНХ:Добавьте имя для скаляров.Видно в Paraview.
  • ЭНХ:vtkDataArray теперь имеет новый суперкласс — vtkAbstractArray...
  • ЭНХ:Установите количество образцов на пиксель по умолчанию для файлов, в которых отсутствуют эти метаданные.
  • ЭНХ:Читайте только то, что вам нужно.
  • ЭНХ:добавить поддержку многостраничных файлов TIFF
  • ЭНХ:распечатать ивары
  • ОШИБКА:Программа чтения TIFF неправильно учитывала данные в кодировке RLE.Кроме того, ExecuteInformation перезаписана пользовательским интервалом и происхождением.
  • ОШИБКА:при чтении beach.tif (из текущего CVS VTKData) изображение загружается вверх ногами.
  • СТИЛЬ:s/OrientationTypeSpecifiedFlag/OriginSpecifiedFlag/g и s/OrientationTypeSpecifiedFlag/SpacingSpecifiedFlag/g
  • ОШИБКА:Reader неправильно обрабатывал экстенты.
  • КОМП:Исправление предупреждения.
  • КОМП:Избавление от предупреждения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top