Как отфильтровать линии хафа для обнаружения нескольких полос?

Я использую HoughTransformP для обнаружения полос в OpenCV C++.

Моя последовательность шагов для обнаружения линии является базовой и выглядит следующим образом:

1. Bird Eye View of image
2. Grayscale image
3. Guassian Blur image
4. Canny Edge detection
5. HoughTransformP canny image
6. Filter out horizontal lines based on the slope

Результат после обнаружения хитрого края:

enter image description here

Проблема здесь в том, что HougLinesP дает несколько линий, а не только полосы. Результат выглядит примерно так:

enter image description here

Я пытаюсь получить что-то вроде этого:

enter image description here

Как мне отфильтровать беспорядок линий и нарисовать только линии полос?

вы всегда можете попытаться установить порог изображения, чтобы получить только желтый / белый цвета, таким образом обнаруженные линии будут от полос

api55 11.04.2018 12:59

@ api55 Я тоже пробовал установить порог, но все еще вижу беспорядок линий на каждой полосе. И простое определение порога работает не во всех сценариях. Возьмем пример, когда у вас есть дорожный разделитель (который будет белым / желтым и черным) в вашем кадре, и HoughLinesP также дает кучу линий на этом. Как я могу получить одну строку, как показано на изображении в конце вопроса?

user8219368 11.04.2018 14:32

@AkritiRao, можете ли вы нарисовать синие отрезки линии, показанные на изображении i.stack.imgur.com/6wKPD.png?

Alessandro Jacopson 11.04.2018 17:47

Казалось бы, линии, которые должны идти вместе, почти параллельны друг другу.

Dan Mašek 11.04.2018 21:07

@AlessandroJacopson Да, я могу это сделать. Я получаю группу линий на каждой полосе.

user8219368 12.04.2018 09:37

@ DanMašek Да, на изображении с высоты птичьего полета линии параллельны.

user8219368 12.04.2018 09:39

@AkritiRao Так что, возможно, вы можете попробовать реализовать алгоритм, который я предлагаю в ответе, и увидеть результаты.

Alessandro Jacopson 12.04.2018 12:19
1
7
1 515
1

Ответы 1

Схема возможного алгоритма:

  1. Сгруппируйте линейные сегменты: ссылаясь, например, на следующее изображение, вы должны иметь возможность пометить каждый сегмент с помощью 1, 2, 3 или 4.

  2. Для каждого кластера найдите «среднюю линию».

enter image description here

Отрисуйте линейные сегменты в Гессенская нормальная формаx*cos(beta)+y*sin(beta)-p=0, где p - это расстояние между сегментом и исходной точкой, а beta - это угол, который вы видите на следующем изображении:

enter image description here

Вы можете сгруппировать линейные сегменты с помощью некоторой надлежащей техники машинного обучения, например, с помощью вектора входных характеристик [p, beta], затем вы можете найти «среднюю линию», например, усредняя как b, так и beta. Допустим, у вас есть два сегмента [p_1, beta_1] и [p_2, beta_2], принадлежащие одному кластеру, средний сегмент - [(p_1+p_2)/2, (beta_1+beta_2)/2].

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