Какой простой и эффективный метод для выделения отрезков из простого 2D-изображения?
В частности, я пытаюсь извлечь все соответствующие отрезки из скриншотов игры "астероиды". Я просмотрел различные методы обнаружения краев, но ни один из них не подходит к моей проблеме по двум причинам:
Они обнаруживают плавные контуры, тогда как мне просто нужно обнаруживать отрезки прямых линий, и только те, которые находятся в определенном диапазоне длины. Теперь эти ограничения должны значительно облегчить мою задачу по сравнению с обычным случаем, но я не хочу просто использовать детектор по краям с выдувными краями, а затем очистить результат изогнутых линий, поскольку это будет непомерно дорого. Скорость имеет огромное значение для моих целей.
Они выводят модифицированное изображение, где края являются светлыми, в то время как я хочу набор пиксельных координат, отображающих конечные точки обнаруженных отрезков. В качестве альтернативы, список всех пикселей, включенных в каждый сегмент, также будет работать.
У меня есть предположение, что одно из возможных решений будет включать грубое преобразование, но я не знаю, как использовать это, чтобы получить фактическое расположение сегментов линии (то есть конечные точки в пиксельном пространстве). Хотя, даже если бы я это сделал, я понятия не имею, будет ли это самым простым или наиболее эффективным способом ведения дел, отсюда и общая формулировка названия вопроса.
Наконец, вот пример изображения:
Обратите внимание, что все основные линии похожи по длине и плотности, и что общий контраст изображения очень высок. Я надеюсь, что решение моей проблемы будет использовать эти функции, потому что, опять же, эффективность имеет первостепенное значение.
Одно предостережение: хотя большинство отрезков в этом контексте являются частью многоугольника, я не хочу решения, основанного на этом факте.
2 ответа
Взгляните на алгоритм детектора линейных сегментов.
Вот что они делают:
Вы можете найти впечатляющее видео внизу страницы.
Существует реализация C (которая работает с компиляторами C++), которая работает "из коробки". Есть только один или два файла, и никаких дополнительных зависимостей
Но, имейте в виду, алгоритм находится под лицензией GNU Allegro GPL.
Также проверьте EDlines http://ceng.anadolu.edu.tr/cv/EDLines/
Очень быстро и дает очень полезный вывод