KMeans Segmentation.

by

 

Kmeans code.

miKmeans.m
%% Materia: Procesamiento Digital de Imagenes.
% * Autor: PACIOTTI IACCHELLI, Diego Gaston.
% * Ao: 2013.

%% Funcion K-Means.
%%
% * Parametros: 
%%
%              Entrada   -> Matriz de entrada de tamao (MxN)xB (Filas, columnas y bandas de la imagen original).
%              Clusters  -> Cantidad de clases en las que segmentare la imagen.
%%
% * Retorna: 
%%
%              Salida -> Vector con la clasificacion de cada punto.

%% Codigo de la funcion K-Means.
function salida = miKmeans(entrada, clusters)

if (clusters<1)
    error('El numero de Clusters debe ser mayor o igual a 1');
end

din = 2;
dist = zeros (clusters,1);
[M,N] = size(entrada);
R = zeros(M,1);
centroides = zeros(clusters,N);
cant = zeros(clusters,1);
fCentroide = 1;

% Determino los centroides iniciales (Distintos!).
centroides(1,:) = entrada(1,:);
if(clusters ~= 1)
    for x=2:1:clusters
        for index=din:1:M
            din = din + 1;
            if (entrada(index,:) ~= centroides(x-1,:))
                centroides(x,:) = entrada(index,:);
                break;
            end
        end
    end
end

while 1   
    
    antCentroides = centroides;
    cant = zeros(clusters,1);
    % Calculo de distancias de un punto a cada centroide (No considero los centroides)
    for i=1:1:M
        % Verifico que el punto en cuestion no sea un centroide.
        for c=1:1:clusters
            if( (entrada(i,1)==centroides(c,1)) && (entrada(i,2)==centroides(c,2)) && (entrada(i,3)==centroides(c,3)) )
                fCentroide = 0;
            end
        end
        if (fCentroide)
            for c=1:1:clusters
                dist(c) = sqrt(((entrada(i,1))-centroides(c,1))^2 + ((entrada(i,2))-centroides(c,2))^2 + ((entrada(i,3))-centroides(c,3))^2 );
            end
            [val,R(i)] = min(dist);
        end    
        fCentroide = 1;
    end
    
    % Redefino la posicion de los centroides.
    for i=1:1:M
        if (R(i))
            centroides(R(i),:) = centroides(R(i),:) + entrada(i,:);
            cant(R(i)) = cant(R(i)) + 1;
        end
    end
    for c=1:1:clusters
        if (cant(c) ~= 0)
            centroides(c,:) = centroides(c,:)/cant(c);
        end
    end
    
    % Si no cambian las posiciones de los centroides, salgo del lazo.
    if(antCentroides == centroides)
        break;
    end
        
end
salida = R;
end

Contact us