Применимы ли гауссовы и средние кривизны к шероховатым поверхностям?

Для проекта, над которым я работаю, я успешно выполнил процедуру SFM для данных изображения дороги и смог создать файл .ply, содержащий координаты облака точек (X, Y, Z), значения RGB и нормали (nx, Нью-Йорк, Новая Зеландия).

Теперь меня интересует вычисление значений кривизны для каждой точки по имеющимся у меня данным. Я наткнулся на Эквивалент MATLAB для кривизны поверхности в Python, но реализация говорит работать только тогда, когда X, Y и Z являются двумерными массивами.

Применимы ли гауссовская и средняя кривизны, если дорожное покрытие очень неровное? Учитывая данные координат (X, Y, Z) размера NX3 и данные нормалей (nx, ny, nz) размера NX3, как мне найти кривизну? Есть ли текущая реализация на Python?


person troymyname00    schedule 27.02.2017    source источник
comment
Я не знаю об облаках точек, имеющих кривизну. Если вы хотите, чтобы компьютер сделал вывод о какой-то структуре поверхности, я думаю, вам придется пройти что-то вроде scipy.spatial.Delaunay, но я только предполагаю.   -  person Paul Panzer    schedule 27.02.2017
comment
Спасибо, Пол. Я смотрю на Делоне сейчас.   -  person troymyname00    schedule 28.02.2017


Ответы (1)


На самом деле я пишу библиотеку Python для работы с облаками точек.

Используя необработанное облако точек, единственная известная мне концепция «кривизны» - это та, которая вычисляется с использованием собственных значений, полученных из окрестности каждой точки.

Если это то, что вы имеете в виду, вот пример кода:

from pyntcloud import PyntCloud
cloud = PyntCloud.from_file("Box.ply")

Это пример облака точек внутри Box.ply:

пример точки  облако

Шаги для вычисления кривизны:


Получить k-соседей каждой точки:

k_neighbors = cloud.get_neighbors(k=10)

Вычислите собственные значения для каждой точки, используя ее k (в данном случае 10) соседей:

ev = cloud.add_scalar_field("eigen_values", k_neighbors=k_neighbors)

Вычислите кривизну из этих собственных значений:

cloud.add_scalar_field("curvature", ev=ev)

Сохранение облака с новыми скалярными полями:

cloud.to_file("out.ply")

Вот облако точек внутри out.ply, окрашенное в соответствии со значением кривизны, присвоенным каждой точке (белый — более высокие значения кривизны):

кривизна облака точек


Вот пример того, как отфильтровать облако точек, чтобы оставить только те точки, которые имеют значение кривизны выше среднего:

curvature = cloud.points["curvature(K(16))"]
cloud.points = cloud.points[curvature > curvature.mean()]
cloud.to_file("out.ply")

И новый контент out.ply:

облако точек отфильтровано

person David de la Iglesia    schedule 27.02.2017
comment
Спасибо, Дэвид! Ваша работа очень интересна и должна быть полезной. Большое спасибо, что поделились! - person troymyname00; 28.02.2017