www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Сшивание панорамных изображений с помощью OpenCV

Дата публикации Jul 26, 2019

Сшивание изображений - одно из самых успешных приложений в Computer Vision. В настоящее время трудно найти сотовый телефон или API обработки изображений, которые не содержат эту функцию.

В этой части мы поговорим о том, как выполнить сшивание изображений с использованием Python и OpenCV. Учитывая пару изображений, которые имеют общую область, наша цель состоит в том, чтобы «сшить» их и создать сцену панорамного изображения.

В этой статье мы рассмотрим некоторые из самых известных методов Computer Vision. Они включают:

  • Обнаружение ключевых точек
  • Локальные инвариантные дескрипторы (SIFT, SURF и т. Д.)
  • Соответствие функций
  • Гомографическая оценка с использованием RANSAC
  • Перспективная деформация

Мы исследуем много функций, таких как SIFT, SURF, BRISK и ORB. Вы можете следовать с помощью этогоТетрадь колаби даже попробуйте это с вашими фотографиями.

Обнаружение и извлечение функций

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

Более того, наше решение должно быть надежным, даже если изображения имеют различияв одном или нескольких из следующих аспектов:

  • пересчет
  • Угол
  • Пространственная позиция
  • Устройства захвата

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

Давайте сначала рассмотрим простое решение.

Обнаружение ключевых точек

Первоначальный и, вероятно, наивный подход заключался бы в извлечении ключевых моментов с использованием такого алгоритма, как Harris Corners. Затем мы могли бы попытаться сопоставить соответствующие ключевые точки на основе некоторой меры сходства, например евклидова расстояния. Как известно, у углов есть одно приятное свойство:они инвариантны к вращению, Это означает, что после того, как мы обнаружим угол, если мы повернем изображение, этот угол все еще будет там.

Однако, что если мы повернем, то масштабируем изображение? В этой ситуации нам было бы трудно, потому что углы не инвариантны к масштабированию. То есть, если мы увеличим изображение, ранее обнаруженный угол может стать линией!

Таким образом, нам нужны функции, инвариантные к вращению и масштабированию. Вот где появляются более надежные методы, такие как SIFT, SURF и ORB.

Ключевые точки и дескрипторы.

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

Чтобы устранить это ограничение, такие методы, как SIFT, используют разность гауссианов (DoD). Идея состоит в том, чтобы применять DoD к различным версиям одного и того же изображения. Он также использует информацию о соседних пикселях для поиска и уточнения ключевых точек и соответствующих дескрипторов.

Для начала нам нужно загрузить 2 изображения, изображение запроса и изображение обучения. Первоначально мы начинаем с извлечения ключевых точек и дескрипторов из обоих. Мы можем сделать это за один шаг, используя OpenCVdetectAndCompute ()функция. Обратите внимание, что для того, чтобы использоватьdetectAndCompute ()нам нужен экземпляр детектора ключевых точек и объекта дескриптора. Это может быть ORB, SIFT или SURF и т. Д. Кроме того, перед подачей изображений вdetectAndCompute ()мы конвертируем их в оттенки серого.

Мы бегаемdetectAndCompute ()на обоих, запрос и изображение поезда. На данный момент у нас есть набор ключевых точек и дескрипторов для обоих изображений. Если мы используем SIFT в качестве экстрактора объектов, он возвращает 128-мерный вектор объектов для каждой ключевой точки. Если выбран SURF, мы получаем 64-мерный вектор объектов. На следующих изображениях показаны некоторые функции, извлеченные с использованием SIFT, SURF, BRISK и ORB.

Обнаружение ключевых точек и дескрипторов с использованием SIFT
Обнаружение ключевых точек и дескрипторов с использованием SURF
Обнаружение ключевых точек и дескрипторов с использованием расстояний BRISK и Hamming.
Обнаружение ключевых точек и дескрипторов с использованием расстояний ORB и Хэмминга.

Соответствие функций

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

В OpenCV для сопоставления объектов требуется объект Matcher. Здесь мы рассмотрим два вида:

  • Матч грубой силы
  • KNN (k-Ближайшие соседи)

BruteForce (BF) Matcher делает именно то, что предполагает его название. Учитывая 2 набора функций (из изображения A и изображения B), каждый объект из набора A сравнивается со всеми объектами из набора B. По умолчанию BF Matcher вычисляетЕвклидово расстояние между двумя точками, Таким образом, для каждого объекта в наборе A он возвращает ближайший объект из набора B. Для SIFT и SURF OpenCV рекомендует использовать евклидово расстояние. Для других функций, таких как ORB и BRISK, рекомендуется расстояние Хэмминга

Чтобы создать BruteForce Matcher с использованием OpenCV, нам нужно только указать 2 параметра. Первый - это метрика расстояния. Второе - этоперекрестная проверкалогический параметр.

перекрестная проверкаПараметр bool указывает, должны ли две функции соответствовать друг другу, чтобы считаться действительными. Другими словами, для пары функций (f1, f2) считается действительным,f1должен соответствоватьf2а такжеf2должен соответствоватьf1как ближайший матч, а также. Эта процедура обеспечивает более надежный набор соответствующих функций и описана в оригинальном документе SIFT.

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

Вместо того, чтобы возвращать единственное наилучшее совпадение для данной функции, KNN возвращает k наилучших совпадений.

Обратите внимание, что значение k должно быть предварительно задано пользователем. Как мы ожидаем, KNN предоставляет больший набор возможностей-кандидатов. Однако нам нужно убедиться, что все эти совпадающие пары устойчивы, прежде чем идти дальше.

Соотношение Тестирование

Чтобы убедиться, что функции, возвращаемые KNN, хорошо сопоставимы, авторы статьи SIFT предлагают метод, называемыйкоэффициент теста, По сути, мы перебираем каждую из пар, возвращаемых KNN, и проводим дистанционный тест. Для каждой пары функций (f1, f2), если расстояние междуf1а такжеf2находится в определенном соотношении, мы сохраняем его, в противном случае мы его выбрасываем. Также значение коэффициента нужно выбирать вручную.

По сути, коэффициентное тестирование выполняет ту же функцию, что и опция перекрестной проверки в BruteForce Matcher. Оба, убедитесь, что пара обнаруженных объектов действительно достаточно близки, чтобы считаться похожими. 2 рисунка ниже показывают результаты BF и KNN Matcher для функций SIFT. Мы выбрали отображение только 100 совпадающих точек, чтобы очистить визуализацию.

Сопоставление характеристик с использованием KNN и Ration Testing на функциях SIFT
Сопоставление характеристик с использованием Brute Force Matcher для функций SIFT

Обратите внимание, что даже после перекрестной проверки для проверки грубой силы и соотношения в KNN некоторые функции не соответствуют должным образом.

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

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

Оценка гомографии

RANdom SAmple Consensus или RANSAC - это итеративный алгоритм для соответствия линейным моделям. В отличие от других линейных регрессоров, RANSAC разработан так, чтобы быть устойчивым к выбросам.

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

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

Мы видим, что на модель линейной регрессии легко влияют выбросы. Это потому, что он пытается уменьшить среднюю ошибку. Таким образом, он склоняется к моделям, которые минимизируют общее расстояние от всех точек данных до самой модели. И это включает в себя выбросы.

Напротив, RANSAC соответствует модели только на подмножестве точек, определенных как внутренние.

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

Сравнение наименьших квадратов и модели RANSAC. Обратите внимание на значительное количество выбросов в данных.

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

Здесь мы собираемся применить преобразование перспективы к одному из изображений. По сути, перспективное преобразование может объединять одну или несколько операций, таких как вращение, масштабирование, перемещение или сдвиг. Идея состоит в том, чтобы преобразовать одно из изображений так, чтобы оба изображения слились в одно. Для этого мы можем использовать OpenCVwarpPerspective ()функция. Это берет изображение и гомографию как вход. Затем он деформирует исходное изображение в место назначения на основе гомографии.

Полученное панорамное изображение показано ниже. Как мы видим, в результате есть пара артефактов Более конкретно, мы можем видеть некоторые проблемы, связанные с условиями освещения и краевыми эффектами на границах изображения. В идеале, мы можем выполнить методы постобработки для нормализации интенсивности, такие каксоответствие гистограммы, Это, вероятно, сделает результат более реалистичным.

Спасибо за чтение!

Пара входных изображений
Панорамное изображение
Пара входных изображений
Панорамное изображение
Пара входных изображений
Панорамное изображение
Пара входных изображений.
Панорамное изображение

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map