Ответ 1
Я попытался бы использовать представление скелета. Проблема с вашим canny, здесь, состоит в том, что в основном это приводит к двум строкам из-за ширины линии.
Тогда я применил бы на нем преобразование Хафа.
Я написал код, который использует библиотеки OpenCV для обнаружения белых линий, нарисованных на траве. Мне нужно мнение кого-то относительно подхода, который я использовал (поскольку я уверен, что есть намного лучший способ, чем мой). Кроме того, результаты, которые я получаю, не так хороши, как я ожидал, потому что небольшие изменения в изображении требуют настройки параметров (и мне нужно работать с фиксированными параметрами).
Мой подход до сих пор:
Должен ли я изменить последовательность фильтров?
P.S. Я не слишком озабочен обработкой мощности; Я запускаю HoughLinesP на GPU B -)
Кроме того, вот пример изображения:
Результаты, которые я получаю:
с канны
БЕЗ КАЖДОГО (слегка измененные параметры)
Любая помощь или руководство будут оценены! Я просто не знаю, что делать, чтобы улучшить его.
UPDATE
После использования очень быстрой реализации скелета (с TONS размытия) в соответствии с выбранным ответом я получил следующее:
Я попытался бы использовать представление скелета. Проблема с вашим canny, здесь, состоит в том, что в основном это приводит к двум строкам из-за ширины линии.
Тогда я применил бы на нем преобразование Хафа.
Одно из возможных решений заключается в том, чтобы взять все граничные точки, которые вы получаете от обнаружения каменистого края, и поместить линию, используя линейные наименьшие квадраты (возможно, итеративные) в этих точках. Таким образом, вы всегда получаете единственную строку, которая "наилучшим образом соответствует" краевым точкам. Этот метод практически не связан с параметрами.
Я использовал Canny для внутренних изображений, но для наружного я считаю более подходящим фильтр Laplace и фильтр Sobel, чем применять вероятностное преобразование линии Hough (PHT).
Если вы хотите увеличить ваши линии, вы должны попробовать оператор Sobel после Лапласа и, наконец, PHT. Если ваш образ слишком любопытен, это может ухудшиться.
RANSAC
алгоритм может быть хорошим методом. Этот метод похож на подходы regression
или interpolation
. Вы должны извлечь точки после использования edge detection
(лучший метод canny
для этой цели, как я думаю). Тогда вы должны найти лучшую линию. Для нахождения линии, проходящей через несколько точек, существуют различные методы, такие как линейная регрессия или RANSAC. Вы можете найти реализацию и примечания об алгоритме RANSAC
в этой ссылке.
Обратите внимание, что RANSAC и другие полезные алгоритмы для этой цели - already implemented
в OpenCV
(как я знаю в версии 3.2) и в Accord NET
(бесплатная библиотека для обработки изображений).
После вашего последнего результата (после скелетного фильтра) вы получаете много маленьких сегментов. Я думаю, что у вас действительно хорошая позиция в этом вопросе, чтобы реализовать то, что было сделано в этой статье:
http://www.cs.ubc.ca/~lowe/papers/aij87.pdf
В основном, они предоставляют инструменты для перегруппировки различных функций в изображении, исходя из того, насколько они принадлежат одному и тому же объекту. Таким образом, все, что вам нужно сделать, это доставить результаты до их алгоритма, и в результате вы, вероятно, получите одну строку.