Детектор точек интереса SIFT с использованием Python - OpenCV

Опубликовано: 24 Марта, 2022

Детектор SIFT (масштабно инвариантное преобразование Фурье) используется для обнаружения точек интереса на входном изображении. Он позволяет идентифицировать локализованные функции на изображениях, что важно в таких приложениях, как:

  • Распознавание объектов в изображениях
  • Алгоритмы обнаружения пути и обхода препятствий
  • Распознавание жестов, создание мозаики и т. Д.

В отличие от детектора Харриса, который зависит от свойств изображения, таких как точка обзора, глубина и масштаб, SIFT может выполнять обнаружение признаков независимо от этих свойств изображения. Это достигается преобразованием данных изображения в масштабно-инвариантные координаты . Считается, что детектор SIFT является близким приближением к системе, используемой в зрительной системе приматов.

Шаги по извлечению точек интереса

Рис 01: Последовательность шагов, выполняемых в детекторе SIFT

Фаза I: масштабирование космического пика

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

Рис 02: Пики выбираются по шкалам.

На 2D-изображениях мы можем обнаружить точки интереса, используя локальные максимумы / минимумы в масштабном пространстве лапласиана гауссова. Потенциальная точка интереса SIFT определяется для данного значения сигмы путем выбора потенциальной точки интереса и рассмотрения пикселей на уровне выше (с более высокой сигмой), на том же уровне и на уровне ниже (с более низкой сигмой, чем текущий уровень сигмы). Если точка является максимумом / минимумом всех этих 26 соседних точек, это потенциальная точка интереса SIFT - и она действует как отправная точка для обнаружения точки интереса.

Этап II: локализация ключевых точек

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

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

Рис 03 Уточнение ключевых точек после локализации ключевых точек

Этап III: определение ориентации ключевых точек

Чтобы добиться обнаружения, инвариантного относительно поворота изображения, необходимо рассчитать ориентацию для ключевых точек. Это делается путем рассмотрения окрестности ключевой точки и вычисления величины и направления градиентов окрестности. На основе полученных значений строится гистограмма с 36 ячейками для представления 360 градусов ориентации (10 градусов на ячейку). Таким образом, если направление градиента определенной точки составляет, скажем, 67,8 градусов, значение, пропорциональное величине градиента этой точки, добавляется в интервал, представляющий 60-70 градусов. Пики гистограммы выше 80% преобразуются в новую ключевую точку и используются для определения ориентации исходной ключевой точки.

Рис 04: Назначение ориентации соседству и создание гистограммы ориентации

Этап IV: дескриптор ключевой точки

Наконец, для каждой ключевой точки создается дескриптор с использованием окрестности ключевых точек. Эти дескрипторы используются для сопоставления ключевых точек на изображениях. Окрестность ключевой точки размером 16 × 16 используется для определения дескриптора этой ключевой точки. Эта окрестность 16 × 16 разделена на подблоки. Каждый такой подблок представляет собой неперекрывающуюся смежную окрестность 4 × 4. Впоследствии для каждого субблока создается ориентация из 8 ячеек аналогично тому, как описано в разделе «Назначение ориентации». Эти 128 значений ячеек (16 субблоков * 8 ячеек на блок) представлены как вектор для генерации дескриптора ключевой точки.

Пример: детектор SIFT в Python

Выполнение следующего скрипта в том же каталоге с файлом с именем «geeks.jpg» генерирует «image-with-keypoints.jpg», который содержит точки интереса, обнаруженные с помощью модуля SIFT в OpenCV, отмеченные круговыми наложениями.

Below is the implementation: 

Python3

# Important NOTE:  Use opencv <= 3.4.2.16 as
# SIFT is no longer available in
# opencv > 3.4.2.16
import cv2
  
# Loading the image
img = cv2.imread("geeks.jpg")
  
 # Converting image to grayscale
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  
# Applying SIFT detector
sift = cv2.xfeatures2d.SIFT_create() 
kp = sift.detect(gray, None)
  
# Marking the keypoint on the image using circles
img=cv2.drawKeypoints(gray ,
                      kp ,
                      img ,
                      flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
  
cv2.imwrite("image-with-keypoints.jpg", img)

Выход:

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

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.