2015-11-10 3 views
3

Я ищу алгоритм, способный решить эту проблему.Группировка точек, которые представляют строки

Проблема:

У меня есть следующие уставки:

Set of 2D points

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

Optimal output

Некоторые примечания:

  1. точка принадлежит к одному и только линии.
  2. Если точка может принадлежать двум строкам, она должна принадлежать самой сильной.
  3. Линия считается более сильной, чем другая, когда у нее больше точек принадлежности.
  4. Алгоритм не должен охватывать все точки, поскольку они могут быть выбросами.
  5. Пространство содержит много выбросов, которые могут достигать 50% от общей площади.
  6. Производительность имеет решающее значение, в реальном времени это необходимо.

Растворы я нашел до сих пор:

1) Работа с ней как проблема кластеризации:

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

2) накопительные пары, а затем сделать кластеризацию:

Хотя это трудно сделать кластеризацию на точках непосредственно, я думал извлечения пар точек, а затем попытаться сгруппировать их с другими. Итак, у меня есть расстояние между двумя парами, которые могут представлять линейность (две пары находятся в реальных 4 точках). Откат этого метода заключается в том, как выбрать эти пары? Если я полагаюсь на Ecledian-Distance между ними, это может быть неточным, потому что две точки могут быть настолько близки друг к другу, но они пока не делают линию с другими.

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

P.S. Вы можете использовать любую готовую функцию OpenCV, думая о любом решении.

+0

вы посмотрите на обнаружение линии RANSAC? Но ваши линии довольно близки друг к другу, что усложняет ситуацию. И: Если бы вы спросили меня, я бы сгруппировал несколько строк по-разному. – Micka

+0

@ Micka есть ли обнаружение RANSAC Line ((s))? или это просто подходящая линия? –

+0

о различном решении. не проблема, даже если бы это было не так просто –

ответ

6

Как Micka советовал, я использовал Sequential-RANSAC решить мою проблему. Результаты были фантастическими и точно такими, какие я хочу. Идея проста:

  1. Применить RANSAC с моделью подгонки по точкам.
  2. Удалите все точки, которые являются линеями вывода RANSAC.
  3. Хотя есть 2 или больше очков идут на 1.

Я выполнил мой собственный подходят линии RANSAC но unfortnantly я не могу разделить код, потому что он принадлежит к компании я работаю. Тем не менее, здесь есть превосходная линейка RANSAC, которая была реализована на Srinath Sridhar. Ссылка на сообщение: RANSAC-like implementation for arbitrary 2D sets.

Легко сделать Sequential-RANSAC в зависимости от трех простых шагов, упомянутых выше.

Вот некоторые результаты: enter image description here

enter image description here

Смежные вопросы