2016-06-12 100 views
0

我發現下面的代碼段圖像使用K均值聚類,但在下面的代碼,他們使用的一些計算找到最小值,最大值values.I知道K-手段的基本概念算法。但我無法理解這個代碼。可以請任何人解釋。K均值聚類在MATLAB

function [Centroid,new_cluster]=kmeans_algorithm(input_image,k) 
% k = 4; 
input_image=double(input_image); 
new_image=input_image; 
input_image=input_image(:); 
min_val=min(input_image); 
input_image=round(input_image-min_val+1); 
length_input_image=length(input_image); 
max_val=max(input_image)+1; 
hist_gram=zeros(1,max_val); 
hist_gram_count=zeros(1,max_val); 
for i=1:length_input_image 
    if(input_image(i)>0) 
     hist_gram(input_image(i))=hist_gram(input_image(i))+1; 
    end; 
end 
IDX=find(hist_gram); 
hist_length=length(IDX); 
Centroid=(1:k)*max_val/(k+1); 
while(true) 
    old_Centroid=Centroid; 
    for i=1:hist_length 
     new_val=abs(IDX(i)-Centroid); 
     hist_val=find(new_val==min(new_val)); 
     hist_gram_count(IDX(i))=hist_val(1); 
    end 
    for i=1:k, 
     loop_count=find(hist_gram_count==i); 
     Centroid(i)=sum(loop_count.*hist_gram(loop_count))/sum(hist_gram(loop_count)); 
    end 
    if(Centroid==old_Centroid) break;end; 
end 
length_input_image=size(new_image); 
new_cluster=zeros(length_input_image); 
for i=1:length_input_image(1), 
    for j=1:length_input_image(2), 
     new_val=abs(new_image(i,j)-Centroid); 
     loop_count=find(new_val==min(new_val)); 
     new_cluster(i,j)=loop_count(1); 
    end 
end 
Centroid=Centroid+min_val-1; 

特別是在上面的代碼中這個input_image(:)的目的是什麼。在谷歌他們說它像matrix.but仍然我很困惑,無論這是矩陣或陣列

+0

你也可以看看[這個](http://stackoverflow.com/questions/26726257/color-quantization-of-an-image-using-k-means-clustering-using-rgb-features/26726929# 26726929)。 –

+0

@Parag非常感謝 – temp

回答

0

記號(:)摺疊多維矢量成列向量。

data = rand(10,4); 

size(data(:)) 
% 40 1 

然後可以應用正常功能的整個多維數組

min(data(:)); 

代替每個維度獨立地

min(min(data)); 

在代碼您已發佈他們崩潰input_image的列向量只是爲了更容易地應用功能,如minmaxlength

更新

,你已經張貼實際上並不執行的代碼的k-means聚類。它只是創建圖像中所有值的直方圖。他們使用minmax,以確定使用直方圖窗口的數量。

+0

謝謝你,你能解釋一下爲什麼他們使用min最大長度的功能,在K均值算法,我們需要找到重心。但在這裏他們在做什麼?請解釋一下這段代碼。 – temp

+0

@temp更新。實際上並不執行k均值聚類代碼(見k'是如何'從來沒有使用過) – Suever

+0

對不起,這就是我犯錯誤更新it.please通過它 – temp