2017-07-04 25 views
1

Ich möchte Tasche von Visual Wörter in MATLAB implementieren. Zuerst las ich Bilder aus Daten-Set-Verzeichnis und ich SURF Funktionen erfassen und extrahieren sie diese beiden Funktionen detectSURFFeatures und extractFeatures verwenden.Clustering SURF Merkmale eines Bilddatensatzes unter Verwendung von k-means Algorithmus

I speichert jede Funktion in eine Zellenanordnung und schließlich möchte ich sie Cluster die k-means-Algorithmus verwendet, aber ich kann diese Daten nicht passen in k-Means-Funktionseingabe. Wie kann ich SURF-Features in den k-means Clustering-Algorithmus in MATLAB einfügen?

Hier ist mein Beispielcode, das Bild liest aus Dateien und extrahiert die SURF-Funktionen.

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

Antwort

0

kmeans erwartet eine N x P Matrix für die Dateneingabe in die N die Gesamtzahl der Beispiele und P ist die Gesamtzahl von Funktionen. Was Sie falsch machen, ist das Platzieren jeder Feature-Matrix in einem Zellen-Array. Stattdessen müssen Sie alle Features aller Bilder in einer einzigen Matrix verketten.

Der einfachste Weg, das zu tun, den folgenden Code vor Ihrem kmeans Anruf hinzuzufügen wäre:

features = vertcat(features{:}); 

Die Funktion vertcat vertikal Matrizen zusammen gegeben eine Liste von Matrizen-Stack wird die gleiche Anzahl von Spalten, die alle teilen . Doing features{:} Auszüge aus einem comma-separated list, so dass es zu tun entspricht:

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

Der endgültige Effekt ist, dass diese vertikal alle der SURF-Features von jedem einzelnen Bild zusammen in eine 2D-Matrix-Stack wird. Sie verwenden die Standardversion von SURF, daher sollte jedes Feature die Länge 64 haben, also sollten Sie 64 Spalten haben. Die Anzahl der Zeilen sollte die Gesamtzahl der über alle Bilder erkannten Features sein.

Daher ist absolut klar:

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); 
Verwandte Themen