2016-06-12 12 views
0

Ich fand den folgenden Code zum Segmentieren der Bilder mit K bedeutet Clustering, aber in der unteren Code, verwenden sie einige Berechnungen, um die Min, Max Werte zu finden.Ich kenne das Grundkonzept von K-bedeutet Algorithmus.aber ich konnte diesen Code nicht verstehen. Kann jemand bitte erklären.K bedeutet Clustering in 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; 

besonders was ist der Zweck dieses input_image(:) in dem obigen Code. In Google sagten sie es wie matrix.aber immer noch bin ich verwirrt, ob das Matrix oder Array ist

+0

Sie können auch [diese] (http://stackoverflow.com/questions/26726257/color-quantization-of-an-image-using-k-means-clustering-using-rgb-features/26726929# 26726929). –

+0

@Parag Vielen Dank – temp

Antwort

0

Die Notation (:) kollabiert einen mehrdimensionalen Vektor in einen Spaltenvektor.

data = rand(10,4); 

size(data(:)) 
% 40 1 

Dann können Sie eine normale Funktion zu einem gesamten mehrdimensionales Array anwenden

min(data(:)); 

Statt zu jeder Dimension unabhängig

min(min(data)); 

In dem Code, den Sie gebucht haben , sie kollabieren input_image zu einem Spaltenvektor, nur um es einfacher zu machen, Funktionen wie min anzuwenden , max und length.

aktualisieren

Der Code, den Sie gebucht haben, tatsächlich nicht durchführen k-Means-Clustering. Es erstellt einfach ein Histogramm aller Werte im Bild. Sie verwenden min und max, um die Anzahl der für das Histogramm zu verwendenden Klassen zu bestimmen.

+0

Danke, können Sie erklären, warum haben sie min max Länge Funktion verwendet, in K bedeutet Algorithmus, müssen wir den Schwerpunkt finden. Aber hier was sie tun? Bitte erläutern Sie diesen Code. – temp

+0

@temp Aktualisiert. Der Code führt kein Kmeans-Clustering durch (siehe, wie 'k' nie benutzt wird) – Suever

+0

Entschuldigung, das ist mein Fehler. Ich habe es aktualisiert. Bitte gehen Sie es durch. – temp

Verwandte Themen