2015-08-31 15 views
5

Ich arbeite gerade an einem Projekt, das mit Farbquantisierung verwandt ist. Der Algorithmus impliziert als erster Schritt K-Means-Algorithmus. Mein Code untill jetzt:Matlab Color Quantization

N = 10; 
K=7; 
I=imread('baboon.bmp'); 
Idouble = double(I); 
mat=zeros(size(I,1)*size(I,2),size(I,3)); 
R=I(:,:,1); 
G=I(:,:,2); 
B=I(:,:,3); 

mat(:,1)=R(:); 
mat(:,2)=G(:); 
mat(:,3)=B(:); 
[IDX,CENTERS] = kmeans(mat,N); 

Nächster Schritt in dem Algorithmus ist das Finden der beliebteste Farbe (die Farbe, die die meisten Pixel im Bild enthält). Es scheint sehr einfach, aber irgendwie bleibe ich stecken, als ich versuchte, das von IDX Variable zu extrahieren.

+1

Die Variable 'Idouble' nutzlos ist. Außerdem können Sie die letzten 8 Zeilen in einem mit "Squeeze" und Verkettung zusammenführen. Dann verstehe ich deine Frage nicht: Was ist die gewünschte Ausgabe? Warum brauchst du Kmeans? Ist 'single' (...,. 'Rows') nicht genug? – Ratbert

+0

'IDX' sollte den Index des Clusters' [1..k] 'für jeden Punkt in' mat' enthalten. Also sollte 'sum (IDX == 1)' dir die Anzahl der Punkte in Cluster 1 geben, oder? – beaker

+1

@becher ja .. du hast recht .. –

Antwort

1

kmeans gibt die Schwerpunkte/repräsentativen Farben, die in Ihrem Bild in CENTERS und IDX gespeichert sind, gibt Ihnen die Mitgliedschaft jedes Pixels. Jede Reihe von CENTERS ist ein Schwerpunkt und damit, IDX sagt Ihnen, welche Zeile von CENTERS müssen Sie verweisen, dass ein Pixel in Ihrem Bild nach dem Clustering zugeordnet wurde.

Wenn Sie die "beliebteste Farbe" finden möchten, nehme ich an, dass Sie die meisten häufig auftretenden bedeuten. In diesem Fall gilt eine mode Operation an die Cluster-Mitgliedschaft Vektor, dies dann zu Index verwenden, um in CENTERS die beliebtestenen Cluster zu erhalten:

idx_popular = mode(IDX); 
popular_colour = CENTERS(idx_popular,:); 

Minor Hinweis

Wie kmeans ist ein randomisierte Algorithmus Es ist sehr wahrscheinlich, dass Ihre Clusterschwerpunkte bei jeder Iteration unterschiedlich sind - unabhängig davon, ob sie alle zusammen oder gleich sind, aber in einer anderen Reihenfolge dem Algorithmus unterliegen.

Ich würde vorschlagen, dass Sie den kmeans Algorithmus ein paar Mal ausführen, um sicherzustellen, dass Sie die beliebteste Farbe mit hoher Wahrscheinlichkeit erhalten. Das kann durch die Angabe der Replicates Flagge erfolgen, wenn kmeans ausgeführt wird:

num_repeats = 5; %// For example 
[IDX,CENTERS] = kmeans(mat, N, 'Replicates', num_repeats); 
+2

danke. Ich bin auch auf andere Lösungen gestoßen, aber diese scheint eleganter und definitiv schneller. –

+1

@AlbertoCarp - Kein Problem. Ich bin froh, dass ich das Problem richtig interpretiert habe. Viel Glück! – rayryeng