Создайте пользовательский экстрактор функции

Можно использовать среду сумки функций (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Входной параметр
  • Двоичный файл, шкала полутонов или изображение истинного цвета.

  • Входное изображение от набора изображений, который был первоначально передан в bagOfFeatures.

featuresВывод

  • M-by-N числовая матрица функций изображений, где M является количеством функций и N, является длиной каждого характеристического вектора.

  • Полнометражное, N, должно быть больше, чем нуль и быть тем же самым для всех изображений, обработанных во время процесса создания bagOfFeatures.

  • Если вы не можете извлечь функции от изображения, предоставьте пустую матрицу функции и пустой метрический вектор функции. Используйте пустую матрицу и вектор, если, например, вы не нашли keypoints для выделения признаков.

  • Числовой, действительный, и неразреженный.

featureMetricsВывод

  • M-by-1 вектор метрик функции, указывающих на силу каждого характеристического вектора.

  • Используемый, чтобы применить критерии 'SelectStrongest' в среде bagOfFeatures.

  • Числовой, действительный, и неразреженный.

locationВывод

  • M-by-2 матрица на основе 1 [x y] значения.

  • [x y] значения могут быть дробными.

  • Числовой, действительный, и неразреженный.

Предварительно обработайте изображение

Входные изображения могут потребовать предварительной обработки перед выделением признаков. Чтобы извлечь функции 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