Как можно сэмплировать параметрическую границу объекта по N точкам, получая равные части длины дуги? - PullRequest
4 голосов
/ 14 января 2011

Параметрическая граница объекта может быть извлечена в Matlab с помощью функции bwtraceboundary .Он возвращает матрицу B размером 2 на 2, где Q - количество граничных пикселей для объекта, а в первом и втором столбцах хранятся координаты строки и столбца граничных пикселей соответственно.

Что я хочуНужно сделать выборку этой границы Q элементов по N точкам, которые делят исходную границу на отрезки равной длины арки.

Прямое решение, которое, как я думал, состоит в вычислении длины L границы путем суммирования расстояниявсе два последовательных граничных пикселя.Эти расстояния либо 1, либо sqrt (2).Затем я делю L на N, чтобы найти желаемую длину дуг.Наконец, я снова перебираю границу, суммируя расстояние всех двух последовательных граничных пикселей.Когда сумма больше или равна требуемой длине дуги, текущий пиксель границы выбирается как один из N, который будет составлять выборочную границу.

Это хорошее решение?Есть ли более эффективное / простое решение?

1 Ответ

5 голосов
/ 14 января 2011

За эти годы я видел этот вопрос, казалось бы, огромное количество раз. Поэтому я написал небольшой инструмент, который будет делать именно это. Образец кусочно-линейной или даже криволинейной (сплайновой) дуги в общем количестве измерений, чтобы последовательные точки находились на одинаковом или заданном расстоянии вдоль этой дуги.

В случае использования просто кусочно-линейных дуг это довольно просто. Вы суммируете общую длину дуги кривой, затем выполняете интерполяцию по длине дуги, но, поскольку она, как известно, является кусочно-линейной, требуется только линейная интерполяция по этой длине как функция кумулятивной длины дуги.

В случае изогнутой дуги это легче всего сделать как решение системы обыкновенных дифференциальных уравнений, следящих за событиями на этом пути. ODE45 делает это красиво.

Вы можете использовать interparc , как это можно найти на MATLAB Central File Exchange, чтобы сделать это для вас, или если вы хотите научиться делать это самостоятельно для простого кусочно-линейного случая, прочитайте первую часть кода, где я делаю кусочно-линейную интерполяцию длины дуги. Хорошо, что линейный случай выполнен в полностью векторизованном виде, поэтому явных циклов не требуется.

...