Детектор точек интереса SIFT с использованием Python - OpenCV
Детектор SIFT (масштабно инвариантное преобразование Фурье) используется для обнаружения точек интереса на входном изображении. Он позволяет идентифицировать локализованные функции на изображениях, что важно в таких приложениях, как:
- Распознавание объектов в изображениях
- Алгоритмы обнаружения пути и обхода препятствий
- Распознавание жестов, создание мозаики и т. Д.
В отличие от детектора Харриса, который зависит от свойств изображения, таких как точка обзора, глубина и масштаб, SIFT может выполнять обнаружение признаков независимо от этих свойств изображения. Это достигается преобразованием данных изображения в масштабно-инвариантные координаты . Считается, что детектор SIFT является близким приближением к системе, используемой в зрительной системе приматов.
Шаги по извлечению точек интереса
Фаза I: масштабирование космического пика
Концепция пространства масштабирования касается применения непрерывного диапазона фильтров Гаусса к целевому изображению таким образом, чтобы выбранный Гауссиан имел разные значения параметра сигма. Полученный таким образом график называется Масштабным Пространством . Выбор пика пространства шкалы зависит от допущения пространственного совпадения . В соответствии с этим, если край обнаружен в одном и том же месте в нескольких масштабах (обозначен пересечением нуля в пространстве масштабов), мы классифицируем его как фактическое ребро.
На 2D-изображениях мы можем обнаружить точки интереса, используя локальные максимумы / минимумы в масштабном пространстве лапласиана гауссова. Потенциальная точка интереса SIFT определяется для данного значения сигмы путем выбора потенциальной точки интереса и рассмотрения пикселей на уровне выше (с более высокой сигмой), на том же уровне и на уровне ниже (с более низкой сигмой, чем текущий уровень сигмы). Если точка является максимумом / минимумом всех этих 26 соседних точек, это потенциальная точка интереса SIFT - и она действует как отправная точка для обнаружения точки интереса.
Этап II: локализация ключевых точек
Локализация ключевых точек включает уточнение ключевых точек, выбранных на предыдущем этапе. Ключевые точки с низким контрастом, нестабильные ключевые точки и ключевые точки, лежащие на краях, устраняются. Это достигается путем вычисления лапласиана ключевых точек, найденных на предыдущем этапе. Значения экстремумов вычисляются следующим образом:
В приведенном выше выражении D представляет собой разность гауссиана. Чтобы удалить нестабильные ключевые точки, вычисляется значение z, и если значение функции в z ниже порогового значения, точка исключается.
Этап III: определение ориентации ключевых точек
Чтобы добиться обнаружения, инвариантного относительно поворота изображения, необходимо рассчитать ориентацию для ключевых точек. Это делается путем рассмотрения окрестности ключевой точки и вычисления величины и направления градиентов окрестности. На основе полученных значений строится гистограмма с 36 ячейками для представления 360 градусов ориентации (10 градусов на ячейку). Таким образом, если направление градиента определенной точки составляет, скажем, 67,8 градусов, значение, пропорциональное величине градиента этой точки, добавляется в интервал, представляющий 60-70 градусов. Пики гистограммы выше 80% преобразуются в новую ключевую точку и используются для определения ориентации исходной ключевой точки.
Этап 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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.