Дескриптор SURF и сопоставление для нескольких изображений в Matlab

Я работаю над проектом поиска изображений на основе контента, используя Matlab, когда я применяю функцию point=detectSURFFeatures(image)я получил 83*1 точка серфинга, которая имеет следующую информацию:

         `Scale: [83x1 single]
          SignOfLaplacian: [83x1 int8]
          Orientation: [83x1 single]
          Location: [83x2 single]
          Metric: [83x1 single]
          Count: 83`

Мне нужно знать, как я могу извлечь (отличительный и фиксированный) вектор объектов, который представляет каждое изображение в базе данных, содержащей тысячи изображений, пожалуйста, помогите?
Вот образцы базы данных. (База данных Ван)

2 ответа

Решение

В настоящее время я использую imread читать изображение следующим образом. Matlab-х detectSURFFeatures функция работает только на серых изображениях.

I = rgb2gray( imread( '434.jpg' ) );

Вы можете запустить эту строку, чтобы получить функции SURF.

points = detectSURFFeatures( I );

Вы можете построить функции серфинга, используя следующее.

imshow( I );
hold on;
plot( point.selectStrongest(10) );
hold off;

Вот визуализация изображения, с которым я работал.

введите описание изображения здесь

Эта печать points объект, вы можете получить следующие свойства, показывающие 41 функции.

          Scale: [41x1 single]
SignOfLaplacian: [41x1 int8]
    Orientation: [41x1 single]
       Location: [41x2 single]
         Metric: [41x1 single]
          Count: 41

Если у вас есть все изображения в градациях серого, хранящиеся в объекте ячейки с именем cellimg (один элемент ячейки для каждого изображения), вы можете запустить detectSURFFeatures на каждом из них следующим образом.

cellsurf = cellfun( @(I) detectSURFFeatures( I ), cellimg, 'UniformOutput', false );

Каждый элемент cellsurf будет содержать пункты SURF. Поскольку вам нужен набор отличительных и фиксированных функций, которые будут идентифицировать каждое изображение, вы можете выбрать самые сильные точки на каждом изображении в cellsurf, Вы можете использовать верх n количество функций или набор n = min( points ), Рассчитайте минимальное количество функций, используя следующий код.

n = min( cellfun( @(S) S.Count, cellsurf ) );

Затем вы можете выбрать самые сильные точки, запустив selectStrongest на каждой клетке в cellsurf,

F = cellfun( @(S) S.selectStrongest( n ), cellsurf, 'UniformOutput', false);

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

Заметки

  • Если вам нужно больше возможностей, вы можете указать другой параметр "MetricThreshold" при вызове detectSURFFeatures функция.
  • Вы можете использовать другие алгоритмы функций вместо SURF, используя функции: detectBRISKFeatures, detectFASTFeatures, detectHarrisFeatures, detectMinEigenFeatures, detectMSERFeatures

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

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

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