1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| % Lecture et affichage de l'image
clear all;
niveau=imread('index.jpg');subplot(1,2,1);imshow(niveau);
%Initialisation
m=2; %degré de flou
nc=2 %Nombre de classes
[r,c]=size(niveau);
% matrice de partition qui comporte le degré de partition de chaque pixel
d=zeros(r*c,nc);
v=zeros(1,r*c);
x=zeros(1,r*c);
for t=1:c %Remplissage de r
x(r.*(t-1)+1:r.*t)= niveau(:,t);
end;
randn('seed',0);
u=0.1*randn(r*c,nc);
u=u-mean2(u);
N=norm(u);
% Calcul des centres de classes
nil=0;
while N>0.0001
for i=1:nc
v(i)=x*(u(:,i).^m)./sum(u(:,i).^m);
end;
%Mise à jour de la matrice de partition U
%Calcul des distances euclidiennes
for i=1:nc
d(:,i)=abs(x'-v(i));
end;
%calcul de la matrice de partition
s=u;
u=zeros(r*c,nc);
for i=1:r*c
if d(i,1)<d(i,2);
u(i,1)=1;
else
u(i,2)=1;
end;
end;
N=norm(s-u);
nil=0;
nil=nil+1;
end
nil;
%Construction de la matrice de l'image segmentée
b4=zeros(r,c);
for i=1:r
for j=1:c
for k=1:nc
if u((j-1)*r+i,k)==1
b4(i,j)=k;
end;
end;
end;
end;
b4=2-b4;
subplot(1,2,2);
imshow(b4,[]);
title('Segmentation avec k-means'); |
Partager