Любопытно узнать о различиях в vtkMassProperties для VTK 5.04 и VTK 5.4.2.
Вопрос
У меня есть маленький питон 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
может быть слишком высоким.