Понижение/прореживание облака точек ближайшего соседа

Я ищу способ уменьшить разрешение облака точек на основе близости точек к их соседям (насколько я могу судить, это синоним «прореживания»). Хотя в настоящее время я использую PyVista в качестве основной библиотеки, я не вижу ни одного класса/метода, которые могли бы достичь того, что я ищу, посколькуdecimateМетод, который принадлежит классу PolyDataFilter , предназначен только для точек, которые были объединены в сетку (и я хочу уничтожить свое облако точек перед созданием сетки).

Как мне добиться такого уничтожения, не разработав с нуля собственный метод?

1 ответ

Разработчик PyVista здесь ;)

Я думаю, ты, возможно, захочешь попробоватьclean()фильтр в PyVista (вроде как доступен только дляPolyDataтипы — каким будет ваше облако точек). На самом деле у нас есть фрагмент внутреннего кодаglyph()фильтр, который демонстрирует это, когда необходимо таким образом уменьшить разрешение точек для обозначения многих геометрических фигур в качестве репрезентативной выборки большого векторного поля. Пример в нашей документации демонстрирует это на наборе игрушечных данных. Но ты не глифируешь! Итак, ниже приведен фрагмент, который, надеюсь, подойдет для вашего случая использования. Ключевым моментом здесь будетmerge_tolаргумент для определения близости. Пожалуйста, обратитесь к нашей активной документации для использования этого.

      import pyvista as pv
import numpy as np

source_points = np.random.rand(10_000, 3)
dense = pv.PolyData(source_points)

# Recomend reading PyVista's docs on how to use this parameter
# the gist: tolerance is in terms of fraction of bounding box diagonal length (0-1)
tolerance = 0.05

# This can take some time for large point clouds
small = dense.clean(
    point_merging=True,
    merge_tol=tolerance,
    lines_to_points=False,
    polys_to_lines=False,
    strips_to_polys=False,
    inplace=False,
    absolute=False,
    progress_bar=True,  # eh, not sure why its non-interactive
)

Тогда, конечно, постройте график, потому что это PyVista!

      pl = pv.Plotter(shape=(1, 2))
pl.add_mesh(dense, render_points_as_spheres=True)
pl.subplot(0, 1)
pl.add_mesh(small, render_points_as_spheres=True)
pl.link_views()
pl.view_isometric()
pl.show()

насколько я могу судить, это синоним слова "децимация"

Хм, терминология здесь определенно сбивает с толку. В PyVista прореживание в настоящее время предназначено для уменьшения количества треугольников в сетке. Я думаю, что «понижение разрешения» — лучший термин для этого, и согласен, что не очевидно, что «чистый» фильтр — это то, что вам нужно (пиар по улучшению нашей документации всегда приветствуются).

Другие вопросы по тегам