📄 kmedia.m
字号:
function [Z,Imcluster] = kmedia(image,k)
%%%%%%%%%%%%%%%%
% Parametros %
%%%%%%%%%%%%%%%%
data = double(imread(image));
% data=rgb2gray(data);
[a,b] = size(data);
ImVecteur = reshape(data,[a*b 1]);
r = size(ImVecteur);
cluster=zeros(r); % Espacio temporal interno de la funcion.
change=1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Inicializacion de los centros %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Z= inicializa_centros(ImVecteur, k);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Bucle iterativo de clustering (Programa principal) %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while change==1,
change=0;
% Calcula y asigna a cada coordenada {X,Y} su centro mas cercano.
for i=1:r,
m=pres(ImVecteur(i), Z, k);
if m~=cluster(i), % Comparamos el valor anterior del centro mas cercano.
change=1;
end;
cluster(i)=m;
end;
% Si ha cambiado alguna asignacion recalculamos los centros
if change==0,
Z=recalcul(cluster, ImVecteur, k,Z);
end;
end;
Imcluster = reshape(cluster,[a b 1]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Separamos los puntos en k vectores representativos de los k patrones %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Xcluster=0;
%Ycluster=0;
%for m=1:k
% inedx=0;
% index=find(cluster==m);
% s2=size(index);
% s2=s2(2);
% for n=1:s2
% Xcluster(1,n,m)= X(index(n));
% Ycluster(1,n,m)= Y(index(n));
% end;
%end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Fin del programa principal %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % Codigo de las subfunciones utilizadas %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Funcion para calcular el centro mas cercano a cada punto %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [m] = pres(valeur, Z, k)
dtemp=0;
d=0;
for j=1:k
d=distancia(Z(j), valeur); % Distancia del centro al punto.
if j<2,
m=j; % La primera distancia siempre es valida.
dtemp=d;
elseif d < dtemp,
m=j; % Nos quedamos con el centro al que corresponde
dtemp=d; % la menor de las distancias.
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Funcion para reasignar los centros %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Zout1] = recalcul(cluster, ImVecteur, k, Z) %Realiza la media de los puntos asigandos a cada clase corersp. a los centros
Zout1 = zeros(k);
for m=1:k
index=find(cluster==m);
if isempty(index)==0
sindex=size(index);
sindex=sindex(2);
Zout1(m)=(sum(ImVecteur(index))) / sindex;
else
Zout1(m)=Z(m);
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calcula la distancia entre dos putos %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [dist]=distancia(P1, P2)
dist=abs(P1-P2);% Distancia entre dos puntos.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Inicializa los centros %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Z]=inicializa_centros(ImVecteur, k)
% Distribuye los centros uniformemente
dx= (max(ImVecteur))-(min(ImVecteur));
dzx= dx/(k+1); % distancia entre centros coordenada X.
for i=1:k,
Z(i)=min(ImVecteur)+(dzx*i);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -