Получить траекторию от диаграммы Вороного для полигональных препятствий

Я пытаюсь получить траекторию из диаграммы Вороного, используя библиотеку вороной из Matlab. Я использую этот код:

vo = (все препятствия из бинарной картинки, нанесенной на рисунок), где:

  • vo(1,:): точки оси X
  • vo(2,:): точки оси Y

Код:

figure; hold on;
plot(vo(1,:),vo(2,:),'sr');

[vx,vy] = voronoi(vo(1,:),vo(2,:));

plot(vx,vy,'-b');

Получение: введите описание изображения здесь

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

1 ответ

Отличительным свойством бесполезных линий в этом случае является то, что они содержат хотя бы одну вершину внутри полигональных препятствий.

Существует множество способов решить, удовлетворяет ли вершина этому условию, но, учитывая, что координаты берутся из двоичного изображения, одним из самых простых может быть проверка, находится ли вершина на расстоянии пикселя от любой точки в vo:

[~,D] = knnsearch(vo,[vx(:),vy(:)]);
inObstacle = any(reshape(D,size(vx)) < 1);
plot(vx(:,~inObstacle),vy(:,~inObstacle),'-b');

Если вы не можете полагаться на препятствия, заполняемые пикселями (например, они могут быть пустыми), то вам, вероятно, необходимо определить, какие пиксели принадлежат одному и тому же препятствию (возможно, используя kmeans или же bwconncomp), а затем устраните ребра Вороного, которые вторгаются в выпуклую оболочку каждого объекта. Для данного препятствия, состоящего из пикселей в vo перечислены по линейным индексам idx:

K = convhull(vo(idx,1),vo(idx,2));
inObstacle = inpolygon(vx,vy,vo(idx(K),1),vo(idx(K),2));
Другие вопросы по тегам