прореживание сетки в Python

У меня есть треугольная сетка с высоким разрешением примерно с 2 миллионами треугольников. Я хочу уменьшить количество треугольников и вершин примерно до ~ 10000 каждый, сохраняя при этом его общую форму, насколько это возможно.

Я знаю, что это можно сделать в Matlab с помощью reducepatch. Другой альтернативой является пакет qslim. Также есть функция прореживания в VTK, который имеет интерфейс python, поэтому технически это возможно и в python. Meshlab, вероятно, также доступен на python (?).

Как я могу сделать такое прореживание сетки в Python? Будем очень признательны за примеры.


person AnandJ    schedule 05.07.2016    source источник
comment
может быть с этим примером? его нет на Python, но его легко перевести vtk.org/ Wiki / VTK / Примеры / Cxx / Meshes / Decimation   -  person MrPedru22    schedule 05.07.2016
comment
да, я видел это, но мне непросто перевести, так как я только новичок. Любая помощь будет принята с благодарностью.   -  person AnandJ    schedule 05.07.2016
comment
Последние обновления версии VTK python содержат следующее: lorensen.github.io/VTKExamples/ site / Python /   -  person AnandJ    schedule 10.05.2019


Ответы (3)


Вот минимальный прототип Python, переведенный из его примера vtk, эквивалентного c ++ (http://www.vtk.org/Wiki/VTK/Examples/Cxx/Meshes/Decimation), как MrPedru22 Хорошо предположил.

from vtk import (vtkSphereSource, vtkPolyData, vtkDecimatePro)


def decimation():
    sphereS = vtkSphereSource()
    sphereS.Update()

    inputPoly = vtkPolyData()
    inputPoly.ShallowCopy(sphereS.GetOutput())

    print("Before decimation\n"
          "-----------------\n"
          "There are " + str(inputPoly.GetNumberOfPoints()) + "points.\n"
          "There are " + str(inputPoly.GetNumberOfPolys()) + "polygons.\n")

    decimate = vtkDecimatePro()
    decimate.SetInputData(inputPoly)
    decimate.SetTargetReduction(.10)
    decimate.Update()

    decimatedPoly = vtkPolyData()
    decimatedPoly.ShallowCopy(decimate.GetOutput())

    print("After decimation \n"
          "-----------------\n"
          "There are " + str(decimatedPoly.GetNumberOfPoints()) + "points.\n"
          "There are " + str(decimatedPoly.GetNumberOfPolys()) + "polygons.\n")


if __name__ == "__main__":
    decimation()
person GioR    schedule 05.07.2016
comment
Примечание: точки в исходных полиданных должны быть уникальными. Если в polydata.GetPoints() есть повторяющиеся точки, то в новой сетке появляются промежутки. vtkSTLReader по умолчанию убирает двуличность, а vtkXXXSources разработаны так, чтобы не допускать двуличия. Но если вы создали эти полиданные с нуля или считали сетку с помощью не-VTK-ридера, вам может потребоваться vtkCleanPolyData первым. - person pullmyteeth; 15.01.2020

Я бы порекомендовал вам использовать vtkQuadricDecimation, качество выходной модели визуально лучше, чем при использовании vtkDecimatePro (без правильных настроек).

decimate = vtkQuadricDecimation()
decimate.SetInputData(inputPoly)
decimate.SetTargetReduction(0.9)

Одна из самых важных вещей - использовать двоичное представление при сохранении STL:

stlWriter = vtkSTLWriter()
stlWriter.SetFileName(filename)
stlWriter.SetFileTypeToBinary()
stlWriter.SetInputConnection(decimate.GetOutputPort())
stlWriter.Write()
person daniel.nikulin    schedule 10.01.2020

Лучший элегантный и самый красивый инструмент децимации Python с использованием meshlab (в основном библиотеки MeshlabXML) можно найти в этом репозитории доктора Хусейна Бакри https://github.com/HusseinBakri/3DMeshBulkSimplification

Я использую это все время. Взгляните на код

person HB87    schedule 15.05.2021