Подтвердить что ты не робот

Хороший подход для обнаружения линий в изображении?

Я написал код, который использует библиотеки OpenCV для обнаружения белых линий, нарисованных на траве. Мне нужно мнение кого-то относительно подхода, который я использовал (поскольку я уверен, что есть намного лучший способ, чем мой). Кроме того, результаты, которые я получаю, не так хороши, как я ожидал, потому что небольшие изменения в изображении требуют настройки параметров (и мне нужно работать с фиксированными параметрами).

Мой подход до сих пор:

  • Захватите изображение с веб-камеры (и, очевидно, превратитесь в градацию серого)
  • Запустите его через пороговый фильтр (используя режим THRESH_TO_ZERO, где он нулирует любые пиксели НИЖЕ порогового значения).
  • размытие изображения
  • запустить его через фильтр эрозии
  • запустить его через детектор кросс-кантов
  • наконец, возьмите это обработанное изображение и найдите строки, используя вероятностное преобразование Hough HoughLinesP

Должен ли я изменить последовательность фильтров?

P.S. Я не слишком озабочен обработкой мощности; Я запускаю HoughLinesP на GPU B -)

Кроме того, вот пример изображения: original image

Результаты, которые я получаю: с канны with canny БЕЗ КАЖДОГО (слегка измененные параметры) no canny this time

Любая помощь или руководство будут оценены! Я просто не знаю, что делать, чтобы улучшить его.

UPDATE После использования очень быстрой реализации скелета (с TONS размытия) в соответствии с выбранным ответом я получил следующее: it works!

4b9b3361

Ответ 1

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

Тогда я применил бы на нем преобразование Хафа.

Ответ 2

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

Ответ 3

Я использовал Canny для внутренних изображений, но для наружного я считаю более подходящим фильтр Laplace и фильтр Sobel, чем применять вероятностное преобразование линии Hough (PHT).

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

Ответ 4

RANSAC алгоритм может быть хорошим методом. Этот метод похож на подходы regression или interpolation. Вы должны извлечь точки после использования edge detection (лучший метод canny для этой цели, как я думаю). Тогда вы должны найти лучшую линию. Для нахождения линии, проходящей через несколько точек, существуют различные методы, такие как линейная регрессия или RANSAC. Вы можете найти реализацию и примечания об алгоритме RANSAC в этой ссылке.

Обратите внимание, что RANSAC и другие полезные алгоритмы для этой цели - already implemented в OpenCV (как я знаю в версии 3.2) и в Accord NET (бесплатная библиотека для обработки изображений).

Ответ 5

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

http://www.cs.ubc.ca/~lowe/papers/aij87.pdf

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