Create a Custom Feature Extractor
You can use the bag-of-features (BoF) framework with many different types of image features. To use a custom feature extractor instead of the default speeded-up robust features (SURF) feature extractor, use theCustomExtractor
财产的bagOfFeatures
object.
Example of a Custom Feature Extractor
This example shows how to write a custom feature extractor function forbagOfFeatures
. You can open this example function file and use it as a template by typing the following command at the MATLAB®command prompt:
edit('exampleBagOfFeaturesExtractor.m')
Step 1. Define the image sets.
Step 2. Create a new extractor function file.
Step 3. Preprocess the image.
Step 4. Select a point location for feature extraction.
Step 5. Extract features.
Step 6. Compute the feature metric.
Define the set of images and labels
Read the category images and create image sets.
setDir = fullfile(toolboxdir('vision'),'visiondata','imageSets'); imds = imageDatastore(setDir,'IncludeSubfolders',true,'LabelSource',... 'foldernames');
创建一个新的器函数文件
The extractor function must be specified as a function handle:
extractorFcn = @exampleBagOfFeaturesExtractor; bag = bagOfFeatures(imgSets,'CustomExtractor',extractorFcn)
exampleBagOfFeaturesExtractor
is a MATLAB function. For example:function [features,featureMetrics] = exampleBagOfFeaturesExtractor(img) ...
location
output:function [features,featureMetrics,location] = exampleBagOfFeaturesExtractor(img) ...
The function must be on the path or in the current working folder.
Argument | Input/Output | Description |
---|---|---|
img |
Input |
|
features |
Output |
|
featureMetrics |
Output |
|
location |
Output |
|
Preprocess the image
Input images can require preprocessing before feature extraction. To extract SURF features and to use thedetectSURFFeatures
ordetectMSERFeatures
functions, the images must be grayscale. If the images are not grayscale, you can convert them using theim2gray
function.
grayImage = im2gray(I);
Select a point location for feature extraction
Use a regular spaced grid of point locations. Using the grid over the image allows for dense SURF feature extraction. The grid step is in pixels.
gridStep = 8;gridX = 1:gridStep:width; gridY = 1:gridStep:height; [x,y] = meshgrid(gridX,gridY); gridLocations = [x(:) y(:)];
You can manually concatenate multipleSURFPoints
objects at different scales to achieve multiscale feature extraction.
multiscaleGridPoints = [SURFPoints(gridLocations,'Scale',1.6); SURFPoints(gridLocations,'Scale',3.2); SURFPoints(gridLocations,'Scale',4.8); SURFPoints(gridLocations,'Scale',6.4)];
detectSURFFeatures
ordetectMSERFeatures
, to select point locations.
multiscaleSURFPoints = detectSURFFeatures(I);
Extract features
Extract features from the selected point locations. By default,bagOfFeatures
extracts upright SURF features.
features = extractFeatures(grayImage,multiscaleGridPoints,'Upright',true);
Compute the feature metric
The feature metrics indicate the strength of each feature. Larger metric values are assigned to stronger features. Use feature metrics to identify and remove weak features before usingbagOfFeatures
to learn the visual vocabulary of an image set. Use the metric that is suitable for your feature vectors.
For example, you can use the variance of the SURF features as the feature metric.
featureMetrics = var(features,[],2);
If you used a feature detector for the point selection, then use the detection metric instead.
featureMetrics = multiscaleSURFPoints.Metric;
You can optionally return the feature location information. The feature location can be used for spatial or geometric verification image search applications. See theGeometric Verification Using estimateGeometricTransform2D Functionexample. TheretrieveImages
andindexImages
functions are used for content-based image retrieval systems.
if nargout > 2 varargout{1} = multiscaleGridPoints.Location; end