Обзор

В этой статье я представил подход к использованию мощности алгоритма RANSAC для обнаружения нескольких линий на изображении. RANAC — это надежный алгоритм обнаружения линий, который итеративно создает модели линий, используя подмножество точек. Когда-либо модель оценивается по общему количеству внутренних точек. Выступ определяется как точка, которая находится в пределах заданного порогового расстояния от линии. оценивает, насколько хорошо модель подходит. Реализация алгоритма RANSAC в учебнике дает одну строку (если она существует). Это линия с максимальным выбросом. В этой статье мы рассмотрим, как импровизировать традиционный алгоритм RANSAC, многократно запуская его на одном и том же изображении, чтобы найти несколько прямых линий.

Пример — без шума

Изображение без шума слева и линии, обнаруженные с помощью рекурсивного подхода RANSAC, справа.

Пример — с шумом соли и перца

То же изображение с небольшим шумом с солью и перцем слева и линиями, обнаруженными с помощью рекурсивного подхода RANSAC, справа.

Пример — зашумленное изображение с 2 линиями

Пример — зашумленное изображение с 3 линиями

Обзор RANSAC

Это не подробное объяснение алгоритма RANSAC.

Рассмотрим точки данных ниже

У нас есть смесь вставок (черные) и выбросов (красные). Мы хотим найти модель прямой линии, которая соответствует вставкам

Как помогает алгоритм RANSAC?

RANSAC — это простой алгоритм, основанный на голосовании, который итеративно отбирает совокупность точек и находит подмножество тех линий, которые кажутся соответствующими модели. В данном случае модель представляет собой прямую линию.

Рекурсивный запуск RANSAC. Как это работает?

Сопроводительный код

Я завершил реализацию Scikit Learn’s RANSAC. В качестве критерия остановки я останавливаю итерацию для дальнейших строк, когда больше не остается вставок ИЛИ когда RANSAC создает строку с количеством вставок ниже определенного порога. Этот порог является настраиваемым параметром. Рассматривайте этот порог как средство устранения нежелательных линий.

  • Ссылка на код python здесь
  • Образцы изображений, используемые для разработки кода, поставляются вместе с кодом Python.

Заключение и предостережения

В моем подходе я удаляю лишние точки после каждой итерации. Это может повлиять на обнаружение следующей строки. Рассмотрим ситуацию, когда область пересечения двух линий сильно переполнена, а обнаружение вами линии 1 привело к удалению точек, которые могут быть потенциальными вставками для второй линии.

Общий успех рекурсивного подхода RANSAC зависит от критерия остановки. Я использовал подсчет в качестве сигнала к остановке. Но это может быть не лучший выбор. Другим выбором может быть отношение количества вкраплений к длине сегмента линии. Очень низкое значение будет означать, что обнаруженная линия слишком разреженная, чтобы иметь какое-либо практическое значение.

Что вы думаете об этом подходе? Знаете ли вы какие-либо альтернативы? Я не уверен, пробовали ли это раньше. В любом случае, я хотел бы услышать от вас и внести улучшения, где это возможно.