Можно использовать среду сумки функций (BoF) со многими различными типами функций изображений. Чтобы использовать пользовательский экстрактор функции вместо экстрактора функции ускоренных устойчивых функций (SURF) по умолчанию, используйте свойство CustomExtractor
объекта bagOfFeatures
.
Этот пример показывает, как записать пользовательскую функцию экстрактора функции для bagOfFeatures
. Можно открыть этот файл функции, взятой в качестве примера, и использовать его в качестве шаблона путем ввода следующей команды в командной строке MATLAB®:
edit('exampleBagOfFeaturesExtractor.m')
Шаг 1. Задайте наборы изображений.
Шаг 2. Создайте новый файл функции экстрактора.
Шаг 3. Предварительно обработайте изображение.
Шаг 4. Выберите местоположение точки для выделения признаков.
Шаг 5. Извлеките функции.
Шаг 6. Вычислите метрику функции.
Считайте изображения категории и создайте наборы изображений.
setDir = fullfile(toolboxdir('vision'),'visiondata','imageSets'); imds = imageDatastore(setDir,'IncludeSubfolders',true,'LabelSource',... 'foldernames');
Функция экстрактора должна быть задана как указатель на функцию:
extractorFcn = @exampleBagOfFeaturesExtractor; bag = bagOfFeatures(imgSets,'CustomExtractor',extractorFcn)
exampleBagOfFeaturesExtractor
является функция MATLAB. Например:function [features,featureMetrics] = exampleBagOfFeaturesExtractor(img) ...
location
вывод:function [features,featureMetrics,location] = exampleBagOfFeaturesExtractor(img) ...
Функция должна быть на пути или в текущей рабочей папке.
Аргумент | Ввод/вывод | Описание |
---|---|---|
img | Входной параметр |
|
features | Вывод |
|
featureMetrics | Вывод |
|
location | Вывод |
|
Входные изображения могут потребовать предварительной обработки перед выделением признаков. Чтобы извлечь функции SURF и использовать detectSURFFeatures
или функции detectMSERFeatures
, изображения должны быть шкалой полутонов. Если изображения не являются шкалой полутонов, можно преобразовать их использующий функцию rgb2gray
.
[height,width,numChannels] = size(I); if numChannels > 1 grayImage = rgb2gray(I); else grayImage = I; end
Используйте обычную расположенную с интервалами сетку местоположений точки. Используя сетку по изображению допускает плотное выделение признаков SURF. Шаг сетки находится в пикселях.
gridStep = 8; gridX = 1:gridStep:width; gridY = 1:gridStep:height; [x,y] = meshgrid(gridX,gridY); gridLocations = [x(:) y(:)];
Можно вручную конкатенировать несколько объектов SURFPoints
в различных шкалах, чтобы достигнуть многошкального выделения признаков.
multiscaleGridPoints = [SURFPoints(gridLocations,'Scale',1.6); SURFPoints(gridLocations,'Scale',3.2); SURFPoints(gridLocations,'Scale',4.8); SURFPoints(gridLocations,'Scale',6.4)];
detectSURFFeatures
или detectMSERFeatures
, чтобы выбрать местоположения точки.multiscaleSURFPoints = detectSURFFeatures(I);
Извлеките функции от выбранных местоположений точки. По умолчанию bagOfFeatures
извлекает вертикальные функции SURF.
features = extractFeatures(grayImage,multiscaleGridPoints,'Upright',true);
Метрики функции указывают на силу каждой функции. Большие метрические значения присвоены более сильным функциям. Используйте метрики функции, чтобы идентифицировать и удалить слабые функции перед использованием bagOfFeatures
, чтобы изучить визуальный словарь набора изображений. Используйте метрику, которая подходит для ваших характеристических векторов.
Например, можно использовать отклонение функций SURF как метрика функции.
featureMetrics = var(features,[],2);
Если вы использовали анализатор для выбора точки, то используйте метрику обнаружения вместо этого.
featureMetrics = multiscaleSURFPoints.Metric;
Можно опционально возвратить информацию о местоположении функции. Местоположение функции может использоваться для пространственных или геометрических поисковых приложений верификации изображений. Смотрите, что Геометрическая Верификация Использует пример Функции estimateGeometricTransform. retrieveImages
и функции indexImages
используются для поисковых систем изображений на основе содержимого.
if nargout > 2 varargout{1} = multiscaleGridPoints.Location; end