Я пытаюсь распознать водные пути по аэрофотоснимкам (скажем, из Google Maps). Местные органы власти часто располагают данными ГИС, в которых указано, где находятся водные пути (и дороги, здания и т. Д.), Но данные о них в воде часто несколько неточны, и мы могли бы улучшить их, используя аэрофотоснимки. Итак, у нас уже есть данные, которым не всегда можно доверять.
Я знаю, как выполнить некоторую базовую обработку изображений на данных (к сожалению, у меня пока нет примеров изображений для показа здесь, я пытаюсь представить, как я мог бы это сделать, пока нет рабочего кода):
Я могу собрать некоторый набор значений цвета, используя кусочки водного пути на изображениях, и выяснить, какие пиксели ближе всего к этим цветам, возможно, также для других типов объектов (трава, дороги, здания и т. Д.). Если я установлю порог, на котором пиксели «достаточно близки», я получу набор пикселей, которые, вероятно, являются водными путями (но будет много шума).
Я могу превратить изображение в оттенки серого и использовать стандартный алгоритм обнаружения краев, чтобы выяснить, где находятся края. Опять же, это дает мне набор пикселей с одинаковыми границами, но будет шум, и края будут слишком продуманными и / или будут иметь пропуски.
В качестве результата я хочу получить набор полигонов , очерчивающих вероятные водные пути.
Интуитивно я хотел бы использовать обнаруженные ребра для создания многоугольников и информацию о цвете, чтобы решить, какие из них являются водами, возможно, используя правительственные данные, которые у нас уже есть.
Есть ли известный способ добраться от результата алгоритма обнаружения ребер до хорошего набора замкнутых многоугольников? Или какие-либо другие советы о том, как решить эту проблему, если есть лучший способ?
источник
Ответы:
Это трудно сделать только с информацией о цвете. Цветовые различия между (или даже внутри) аэрофотоснимками могут быть огромными. В идеале вам понадобятся гиперспектральные или хотя бы инфракрасные изображения ( см. Эту статью ).
Предполагая, что ваше обнаружение кромки может привязаться к границам пикселей, вы можете взять границы каждого пикселя как замкнутый многоугольник и объединить их вместе, чтобы сформировать многоугольник (в зависимости от реализации объединения вы можете получить многоугольник с внутренними кольцами или отверстиями) или коллекцию полигонов. Java Топология Сюита и другие вычислительные реализации геометрии может сделать это намного проще для вас. Если вы хотите использовать субпиксельные границы, вам нужно быть очень осторожным, чтобы у вас был хороший набор значений эпсилона, чтобы вы могли привязывать края, которые находятся очень близко, но не совсем соприкасаются.
Если вы хотите взять ребра и объединить их самостоятельно, вы захотите построить граф пересекающихся ребер и реализовать код, который пересекает граф (например, против часовой стрелки), чтобы найти, где он замыкается на себя, образуя многоугольник. Вот как работает объединение реализаций многоугольников.
источник