График Вороного из множества полигонов в Emgu CV (или OpenCV)

Используя Emgu CV, я выделил набор замкнутых многоугольников из контуров в изображении дорожной сети. Многоугольники представляют собой очертания дорог. Результат показан ниже, нанесенный на карту OpenStreetMaps (полигоны в форме "пикселя" из Emgu CV были преобразованы в форму широты/долготы, которая будет построена).

Набор многоугольников, представляющих дорожные очертания:

введите описание изображения здесь

Теперь я хотел бы вычислить диаграмму Вороного этого множества полигонов, что поможет мне найти осевую линию дороги. Но в Emgu CV я могу найти способ получить диаграмму Вороного для множества точек. Это достигается путем поиска триангуляции Delaunay набора точек (с использованием класса Subdiv2D), а затем вычисления фаз voronoi с помощью GetVoronoiFacets.

Я попытался вычислить диаграмму Вороного точек, определенных всеми полигонами в множестве (каждый многоугольник - это список точек), но это дает мне чрезвычайно сложную диаграмму Вороного, может ожидать:

Схема Вороного для множества точек:

введите описание изображения здесь

Это изображение показывает меньшую часть первого изображения (для ясности, так как оно настолько свернуто). Действительно, некоторые из строк на диаграмме, по-видимому, представляют собой осевую линию дороги, но есть так много других линий, будет сложно найти критерий для извлечения "хороших" строк.

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

Я ищу предложения о том, как вычислить график Вороного из множества полигонов, используя Emgu CV (или Open CV), надеясь преодолеть эту вторую проблему, которую я изложил. Я также открыт для других предложений о том, как добиться этого, не используя Emgu CV.

Ответ 1

Если у вас уже есть полигоны, вы можете попробовать вычислить Straight Skeleton.

Я не пробовал, но CGAL имеет реализация. Обратите внимание, что эта конкретная функция license - это GPL.

Возможная проблема может быть:

Текущая версия этого пакета CGAL может только конструировать прямой скелет внутри простого многоугольника с отверстиями, который это не обрабатывает общие многоугольные фигуры в плоскости.

Возможно, для этого есть обходные пути. Например, вы можете включить все многоугольники в большой прямоугольник (таким образом, оригинальные многоугольники будут отверстиями нового прямоугольника). Это может не сработать, если исходные многоугольники имеют отверстия. Чтобы решить эту проблему, вы можете выполнить алгоритм для каждого многоугольника с отверстиями, а затем поместить все полигоны в прямоугольник, удалив все отверстия и снова выполнив алгоритм.