Обзор
В этой статье я представил подход к использованию мощности алгоритма RANSAC для обнаружения нескольких линий на изображении. RANAC — это надежный алгоритм обнаружения линий, который итеративно создает модели линий, используя подмножество точек. Когда-либо модель оценивается по общему количеству внутренних точек. Выступ определяется как точка, которая находится в пределах заданного порогового расстояния от линии. оценивает, насколько хорошо модель подходит. Реализация алгоритма RANSAC в учебнике дает одну строку (если она существует). Это линия с максимальным выбросом. В этой статье мы рассмотрим, как импровизировать традиционный алгоритм RANSAC, многократно запуская его на одном и том же изображении, чтобы найти несколько прямых линий.
Пример — без шума
Изображение без шума слева и линии, обнаруженные с помощью рекурсивного подхода RANSAC, справа.
Пример — с шумом соли и перца
То же изображение с небольшим шумом с солью и перцем слева и линиями, обнаруженными с помощью рекурсивного подхода RANSAC, справа.
Пример — зашумленное изображение с 2 линиями
Пример — зашумленное изображение с 3 линиями
Обзор RANSAC
Это не подробное объяснение алгоритма RANSAC.
Рассмотрим точки данных ниже
У нас есть смесь вставок (черные) и выбросов (красные). Мы хотим найти модель прямой линии, которая соответствует вставкам
Как помогает алгоритм RANSAC?
RANSAC — это простой алгоритм, основанный на голосовании, который итеративно отбирает совокупность точек и находит подмножество тех линий, которые кажутся соответствующими модели. В данном случае модель представляет собой прямую линию.
Рекурсивный запуск RANSAC. Как это работает?
Сопроводительный код
Я завершил реализацию Scikit Learn’s RANSAC. В качестве критерия остановки я останавливаю итерацию для дальнейших строк, когда больше не остается вставок ИЛИ когда RANSAC создает строку с количеством вставок ниже определенного порога. Этот порог является настраиваемым параметром. Рассматривайте этот порог как средство устранения нежелательных линий.
- Ссылка на код python здесь
- Образцы изображений, используемые для разработки кода, поставляются вместе с кодом Python.
Заключение и предостережения
В моем подходе я удаляю лишние точки после каждой итерации. Это может повлиять на обнаружение следующей строки. Рассмотрим ситуацию, когда область пересечения двух линий сильно переполнена, а обнаружение вами линии 1 привело к удалению точек, которые могут быть потенциальными вставками для второй линии.
Общий успех рекурсивного подхода RANSAC зависит от критерия остановки. Я использовал подсчет в качестве сигнала к остановке. Но это может быть не лучший выбор. Другим выбором может быть отношение количества вкраплений к длине сегмента линии. Очень низкое значение будет означать, что обнаруженная линия слишком разреженная, чтобы иметь какое-либо практическое значение.
Что вы думаете об этом подходе? Знаете ли вы какие-либо альтернативы? Я не уверен, пробовали ли это раньше. В любом случае, я хотел бы услышать от вас и внести улучшения, где это возможно.