2015-08-31 12 views
5

Şu anda renk nicelleştirme ile ilgili proje üzerinde çalışıyorum. Algoritma ilk adım k-anlamına gelir algoritması anlamına gelir. Kodum şimdi e kadar: algoritmadaMatlab Renk Nicelleştirme

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

Sonraki adım en popüler rengi (görüntüdeki en pikselleri içeren renk) bulmaktır. Çok kolay görünüyor ama IDX değişkeninden çıkarmaya çalıştığımda biraz takılıyorum.

+1

değişken 'Idouble' işe yaramaz. Ayrıca, son 8 satırı "sıkıştır" ve birleştirme ile birleştirebilirsiniz. O zaman sorunuzu anlamıyorum: İstenen çıktı nedir? Neden kuzeye ihtiyacın var? Eşsiz (...,. 'Satırlar' yeterli değil mi? – Ratbert

+0

'IDX' 'mat' içindeki her nokta için kümenin' [1..k] 'dizinini içermelidir. Yani toplamı (IDX == 1) 'size kümelenme 1'deki puan sayısını vermelidir, değil mi? – beaker

+1

(evet) siz haklısınız .. –

cevap

1

kmeans, CENTERS'da saklanan görüntünüzde bulunan yüzde/temsil edici renkleri döndürür ve IDX size her pikselin üyeliğini verir. CENTERS'un her satırı, bir centroidtir ve IDX, hangi satırda CENTERS'dan hangi satırın, kümenizden sonra görüntünüzdeki bir pikselin atandığını belirtmeniz gerektiğini söyler.

"En popüler renk" değerini bulmak istiyorsanız, sık sık oluşan en kastettiğinizi varsayalım. Bu durumda, küme üyelik dizisine bir mode işlemi uygulamak, daha sonra en popüler küme olsun CENTERS içine endeks için kullanırız

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

Minör Not kmeans gibi

randomize algoritmadır Kümelenme merkezinizin her yinelemede farklı olması muhtemeldir - hepsi birbiriyle ya da aynı olsalar da farklı bir sıraya göre algoritmaya tabidirler.

En yüksek rengi en yüksek renkte alabilmeniz için kmeans algoritmasını birkaç kez çalıştırmanızı öneririm. kmeans çalıştırırken Yani Replicates bayrağı belirterek yapılabilir:

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

Teşekkürler. Diğer çözümlerle de karşılaştım ama bu daha şık ve kesinlikle daha hızlı görünüyor. –

+1

@AlbertoCarp - Hiç sorun değil. Sorunu doğru yorumladım memnunum. İyi şanslar! – rayryeng