2015-04-21 13 views
2

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

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

Мне нужно знать, как я могу извлечь (особенный и исправленный) вектор функции, который представляет каждое изображение в базе данных, содержащей тысячи изображений, любая помощь, пожалуйста?
Адрес samples of the database. (База данных Wang)

+0

Что случилось с 83 точками SURF? Что не так с применением SURF для 1000 изображений и получения отдельных точек? – krisdestruction

+0

, но как я могу сравнить изображение запроса с другими функциями от других изображений, я хочу использовать расстояние, подобное евклидову расстоянию или DTW, для измерения расстояния между изображениями запроса и другими изображениями –

+0

Как я могу использовать 83 точки SURF для сравнения изображений? есть много векторов Масштабирование, Ориентация, местоположение ... и т. д., и это дает различное количество функций (значений) для каждого изображения. –

ответ

2

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

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

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

points = detectSURFFeatures(I); 

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

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

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

enter image description here

Эта печать 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 function.

Примечания

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

Теперь у меня есть cellimg 1 * 2 клетки каждая ячейка содержит полутоновое изображение из базы данных ,,, , когда я применить: 'cellsurf = cellfun (@ (I) detectSURFFeatures (I) cellimg);' , где я есть матрица полутонового изображения Я получаю 'Ошибка использования cellfun Выходной тип SURFPoints в настоящее время не реализован.' –

+0

@AhmedTarawneh Какую версию Matlab вы используете? Можете ли вы обновить до последней версии? – krisdestruction

+0

да я получить точку прибоя теперь, как 'Масштаб: [10х1 сингла] SignOfLaplacian: [10х1 int8] Ориентация: [10х1 сингла] Адрес: [10x2 сингл] Метрика: [10х1 сингла] графа : 10' теперь, как я могу использовать эти точки, чтобы вычислить расстояние например евклидово расстояние .. и т.д. другими словами ** как я могу получить подобное изображение ** ** я использую MatLab 2014 ** –

1

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

Теперь вы пытаетесь преобразовать набор дескрипторов паттерна, представляющих изображение, в один вектор, и есть несколько способов сделать это. Популярный подход называется bag of features, ака-мешок визуальных слов.

 Смежные вопросы

  • Нет связанных вопросов^_^