Какой простой и эффективный метод для выделения отрезков из простого 2D-изображения?

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

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

  2. Они выводят модифицированное изображение, где края являются светлыми, в то время как я хочу набор пиксельных координат, отображающих конечные точки обнаруженных отрезков. В качестве альтернативы, список всех пикселей, включенных в каждый сегмент, также будет работать.

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

Наконец, вот пример изображения:

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

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

2 ответа

Решение

Взгляните на алгоритм детектора линейных сегментов.

Вот что они делают:

Вы можете найти впечатляющее видео внизу страницы.

Существует реализация C (которая работает с компиляторами C++), которая работает "из коробки". Есть только один или два файла, и никаких дополнительных зависимостей

Но, имейте в виду, алгоритм находится под лицензией GNU Allegro GPL.

Также проверьте EDlines http://ceng.anadolu.edu.tr/cv/EDLines/

Очень быстро и дает очень полезный вывод

Другие вопросы по тегам