我想在MATLAB中实现Bag of Visual Words。首先,我从数据集目录中读取图像,然后检测SURF功能并使用这两个函数detectSURFFeatures
和extractFeatures
提取它们。
我将每个特征存储到一个单元格数组中,最后我想使用k-means算法对它们进行聚类,但我不能将这些数据拟合到k-means函数输入中。如何在MATLAB中将SURF特征插入k-means聚类算法?
以下是我的示例代码,它从文件中读取图像并提取其SURF功能。
clc;
clear;
close all;
folder = 'CarData/TrainImages/cars';
filePattern = fullfile(folder, '*.pgm');
f=dir(filePattern);
files={f.name};
for k=1:numel(files)
fullFileName = fullfile(folder, files{k});
image=imread(fullFileName);
temp = detectSURFFeatures(image);
[im_features, temp] = extractFeatures(image, temp);
features{k}= im_features;
end
[centers, assignments] = kmeans(double(features), 100);
答案 0 :(得分:0)
kmeans
期望输入数据为N x P
矩阵,其中N
是示例总数,P
是要素总数。您正在做的错误是将每个要素矩阵放入单元格数组中。你需要做的是将所有图像中的所有特征连接成一个矩阵。
最简单的方法是在kmeans
电话前添加以下代码:
features = vertcat(features{:});
函数vertcat
将垂直堆叠矩阵,给定所有共享相同列数的矩阵列表。执行features{:}
会提取comma-separated list,以便它等同于:
features = vertcat(features{1}, features{2}, ...);
最终效果是,它会将每个图像的所有SURF特征垂直叠加到一个2D矩阵中。您使用的是默认版本的SURF,因此每个功能的长度应为64,因此您应该有64列。行数应该是在所有图像上检测到的要素总数。
因此,绝对清楚:
clc;
clear;
close all;
folder = 'CarData/TrainImages/cars';
filePattern = fullfile(folder, '*.pgm');
f=dir(filePattern);
files={f.name};
for k=1:numel(files)
fullFileName = fullfile(folder, files{k});
image=imread(fullFileName);
temp = detectSURFFeatures(image);
[im_features, temp] = extractFeatures(image, temp);
features{k}= im_features;
end
% New code
features = vertcat(features{:});
% Resume old code
[centers, assignments] = kmeans(double(features), 100);