Danke fuer die Antwort.
Ich versuche mal zu erklaeren, tut mir leid aber mein Deutsch ist ein wenig eingerostet -
Ich bin mir bewusst, dass es bessere Methoden gibt, es geht hier um das Prinzip bzw. eine Uebung fuer einen Test. Ich kannte den Neural Gas Algorithmus allerdings noch nicht, sehr interessant.
Ich verstehe nicht 100% was du mit dem Vektoren/Matrizten Kommentar gemeint hast aber ich glaube ich habe das jetzt richtig gemacht, siehe unten?
Der Code waehlt k zufaellig generierte RGB Centroid-Farbwerte aus, scannt das Bild nach aehnlichen Farbwerten und gibt den Werten die dem jeweiligen Centroid-Wert am naechsten liegen ein label, dann wir der entsprechende Centroid neu justiert und auf den Mittelwert der mit ihm zusammenhaengenden Farbwerte gestellt. Dann geht es wieder von vorne los.
Somit kann man Objekte in einem Bild erkennen wenn diese farblich von Hintergruenden oder anderen Objekten trennbar sind. Dies funktoiniert natuerlich nur sinnvoll wenn die Anzahl der Zentren gut gewaehlt ist (das ist nochmla ein aderes Thema), aber mal angenommen du und dein bester Freund stehen in einem blauen und roten Anzug vor einer weissen wand, dann sollte ich hier am Ende ein neues Bild rausbekommen was mir mit drei Farbwerten (jeweils der Mittelwert von dem blaune, roten und weissen bereich) die Objekte darstellt.
Leider habe ich noch immer das Problem, dass ich die Farbwerte nicht rauskriege, sondern scheinbar nur wieder das Gleiche bild. Ich verstehe irgendetwas noch nicht, kannst du vielleicht mal unabhaengig davon ob du mit dem algorithmus einverstanden bist probieren zu erklaeren warum ich das nicht herauskriege? Waere sehr toll, vielen Dank!
function [newI] = kmeans(I, K)
[Iheight, Iwidth, bits] = size(I);
Ilength = Iheight * Iwidth;
I = reshape(I,[],3);
I = im2double(I);
label = zeros(Iheight * Iwidth, 1);
%create k amount of random absolute RGB values for Ktemp
Ktemp = rand(K,3) * 255;
Kcompare = 0;
while Kcompare ~= Ktemp
Kcompare = Ktemp;
%cycle through each RGB value in image
for n = 1 : Ilength
min = inf;
%cycle through each centroid
for i = 1 : K
%measure eucledian distance between centroid and RGB value
distance = norm(Ktemp(K, - I(n,);
%if distance is less than minimum assign current centroid
if distance < min
min = distance;
label(n) = K;
end
end
end
% ==> each RGB value in I has a label now
%cycle through K's
for i = 1 : K
%set count and Ktemp to 0
count = 0;
Ktemp = zeros(K,3);
%go through each row and add up values for current K
for n = 1 : 1 : Ilength
if label(n) == K
count = count + 1;
Ktemp(i, = Ktemp(i, + I(n,;
end
end
Ktemp = Ktemp / count;
end
end
newI = reshape(I, Iwidth, Iheight, 3);
[/code]