2017-07-04 19 views
1

ビジュアルワードのバッグをMATLABに実装したいと考えています。まず、データセットディレクトリから画像を読み込み、SURF機能を検出して、これら2つの機能detectSURFFeaturesextractFeaturesを使って画像を抽出します。k-meansアルゴリズムを使用した画像データセットのSURFフィーチャのクラスタリング

各機能をセル配列に格納し、最後にk-meansアルゴリズムを使用してクラスタ化したいが、このデータをk-means関数入力に適合させることはできません。 SURF機能をMATLABのk-meansクラスタリングアルゴリズムに挿入するにはどうすればよいですか?

ファイルから画像を読み取り、そのサーフ機能を抽出するサンプルコードです。

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

kmeansNは、実施例の総数であり、Pが特徴の総数である入力データに対するN x P行列を期待します。間違っているのは、各フィーチャーマトリックスをセル配列に配置することです。代わりに、すべての画像のすべてのフィーチャを1つのマトリックスに連結する必要があります。

それを行うための最も簡単な方法は、あなたのkmeans呼び出しの前に次のコードを追加することです:

features = vertcat(features{:}); 

機能がvertcatが垂直方向にすべてが同じ列数を共有行列のリストを与えて一緒に行列をスタックします。それはやっと同等になるようにcomma-separated listfeatures{:}抽出を行う:

features = vertcat(features{1}, features{2}, ...); 

最終的な効果は、これが上下共に2次元マトリックスに一つ一つの画像からSURF特徴のすべてをスタックすることです。デフォルトのバージョンの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); 
関連する問題