Понижение/прореживание облака точек ближайшего соседа
Я ищу способ уменьшить разрешение облака точек на основе близости точек к их соседям (насколько я могу судить, это синоним «прореживания»). Хотя в настоящее время я использую 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 прореживание в настоящее время предназначено для уменьшения количества треугольников в сетке. Я думаю, что «понижение разрешения» — лучший термин для этого, и согласен, что не очевидно, что «чистый» фильтр — это то, что вам нужно (пиар по улучшению нашей документации всегда приветствуются).