Дескриптор 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, которые представляют собой векторы, описывающие патч изображения вокруг каждой интересующей точки.
Теперь вы пытаетесь преобразовать набор дескрипторов патчей, представляющих изображение, в один вектор, и есть несколько способов сделать это. Популярный подход называется набором функций, иначе говоря, набором визуальных слов.