Какой лучший способ определить границы многоугольника на основе начальной точки? - PullRequest
3 голосов
/ 25 июля 2011

Вот моя проблема - у меня есть карта мира или какой-то регион, например:

A map of the world

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

Пока что я думаю о каком-то методе, основанном на заливке - обратите внимание, что скорость и эффективность не так важны, так как скрипт никоим образом не предназначен для использования в реальном времени.

Есть ли лучший способ сделать это, о котором я не знаю? Мой подход в корне неверен? Любые предложения будут оценены!

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

Если регионы полностью изолированы друг от друга, поиск подключенных компонентов поможет. В Mathematica это выглядит так:

Сначала создайте двоичное изображение с карты мира:

regions = ColorNegate[Binarize[img, .9]]

enter image description here

Затем вычислите подключенные компоненты:

components = MorphologicalComponents[regions, CornerNeighbors -> False];

Теперь вы можете извлекать свойства для каждого из компонентов (маски, периметры и т. Д.). Здесь я раскрасил каждый регион уникальным цветом:

Colorize[components]

enter image description here

Чтобы получить границу данного компонента, можно запросить двоичную маску компонента, а затем вычислить периметр. Это получает все маски:

masks = ComponentMeasurements[components, "Mask"];

Например, получить границу или контур одной области:

country = Image[masks[[708, 2]], "Bit"]
border = MorphologicalPerimeter[country]

enter image description here

Получение двухмерных позиций для границы - это просто вопрос выделения белых пикселей на изображении:

pos = Position[ImageData[border], 1]

enter image description here

1 голос
/ 25 июля 2011

если возможно; попытайтесь получить векторные данные за вашей картой из другого источника. Я понимаю, что это не отвечает на ваш вопрос, но для мировых границ (и многих других) вы можете найти их публично в Интернете (Google для "шейп-файла мировых границ"). Это даст вам более точные данные, позволит вам масштабировать на любом уровне, перепроектировать вашу карту, использовать карты Google или другие слои и т. Д. Вы можете красиво отображать векторные данные с помощью таких библиотек, как openlayers и т. Д., Но затем вы медленно движетесь к более сложные вещи ГИС.

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

...