使用k均值算法对图像数据集的SURF特征进行聚类

时间:2017-07-04 21:31:19

标签: matlab image-processing computer-vision k-means surf

我想在MATLAB中实现Bag of Visual Words。首先,我从数据集目录中读取图像,然后检测SURF功能并使用这两个函数detectSURFFeaturesextractFeatures提取它们。

我将每个特征存储到一个单元格数组中,最后我想使用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);

1 个答案:

答案 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);