OpenCV - извлечение дескриптора SIFT/SURF из предварительно обрезанных патчей

У меня есть набор серых пятен размером 100K 64x64 (которые уже выровнены, то есть все они имеют одинаковую ориентацию), и я хотел бы извлечь дескриптор SIFT из каждого с помощью OpenCV.

Мне ясно, что все, что мне нужно сделать, это определить вектор с одной ключевой точкой kp такой, что: kp.x=32, kp.y=32.

Однако я не знаю, как установить параметр kp.size. Просматривая код SIFT, он выглядит так, как будто выполняет некоторые нетривиальные вычисления с этим параметром, а не просто полагает, что это размер патча.

Вопрос 1: каким должен быть параметр kp.size при извлечении дескрипторов SIFT из патчей размером 64x64?

Вопрос 2: каким должен быть параметр kp.size при извлечении дескрипторов SURF из патчей размером 64x64?

2 ответа

Решение

Если вы посмотрите на оригинальную публикацию просеивания, то масштаб ключевой точки используется для взвешивания гистограммы величины и ориентации градиентов (параграф 6. Локальный дескриптор изображения). Так что в вашем случае, так как серые пятна выровнены, вам решать, хотите ли вы взвешивать вклады пикселей дальше от центра пятна или нет, и выбирать масштаб (то есть, с помощью окна взвешивания Гаусса).) соответственно.

Для SURF это в основном тот же принцип, за исключением того, что вместо величины градиента используется ответ на вейвлет Хаара, но вы все равно можете взвешивать эти ответы с помощью гауссовского окна.

Кроме того, поскольку вы работаете с этими выровненными патчами, я бы посоветовал вам не использовать высокоуровневые функции OpenCV, а просто использовать / перекодировать часть извлечения дескриптора и применять любые весовые коэффициенты, которые вы хотите вычислить для представления вашего патча. Одна из причин для этого состоит в том, что в примере SIFT вычисление дескрипторов SIFT может "добавить новые ключевые точки" к предоставленному вами, если алгоритм "недоволен" ориентацией ключевой точки, он дублирует ключевую точку в том же расположение, но другая ориентация.

Хорошо. Таким образом, дескриптор SIFT обычно использует сетку размером 4х4, каждая из которых обычно имеет размер 4х4 пикселя. Поэтому соседство в пикселях обычно 16x16. Шкала / размер - это параметр, определяющий величину понижающей дискретизации / размытия / радиуса ключевой точки. Так что я думаю, что в вашем случае это будет 4.

Вы, вероятно, также знаете, что ключевые точки SIFT также работают на подпиксельных слоях. (32,32) не будет точным центром вашего патча изображения, который на самом деле будет (32,5, 32,5), если размеры вашего изображения (x,y) начинаются с 1. Если они начинаются с 0, это будет (31,5, 31.5)- как в случае с opencv.

Другие вопросы по тегам