% 程序功能:实现具有加权系数的K-均值聚类算法
% 输入:一幅彩色图像
% 输出:分割后的图像
% 主要参数:N:初始分类的组数
% W1:输入分量Y的加权系数
% W2:输入分量Cb的加权系数
% W3:输入分量Cr的加权系数
% pricision:K均值迭代的精度
% 实验人:庞宁
% 实验地点:信通系图像所
% 实验时间:2007.6.7
clc;
clear;
N=input('请输入初始分类的组数N=');
W1=input('请输入分量Y的加权系数W1=');
W2=input('请输入分量Cb的加权系数W2=');
W3=input('请输入分量Cr的加权系数W3=');
pricision=input('K均值迭代的精度pricision=');
D= imread('QQ截图未命名.bmp');
F=D;
figure,imshow(D);
[w,h,s]=size(D);
A=rgb2Ycbcr(D);
A=double(A);
for i=1:N %初始聚类中心的选取
%B(i,:)=A(i,i,:);
%B(i,:)=A(N+1-i,N+1-i,:);
temp=rand(1,2); %随机选取
Aln=round(temp(1,1)*w);
Acol=round(temp(1,2)*h);
B(i,:)=A(Aln,Acol,:);
end
e=10*ones(N,3); %初始的误差矩阵
count=zeros(1,N);
while (sum(sum(e))>pricision) %K-均值聚类算法
S=zeros(w*h,s,N);
for i=1:N
S(1,:,i)=B(i,:);
count(i)=0;
end
for i=1:w %计算加权的颜色欧式距离并根据最近邻域进行分类
for j=1:h
for k=1:N
C(k)=sqrt(W1*(A(i,j,1)-B(k,1))^2+W2*(A(i,j,2)-B(k,2))^2+W3*(A(i,j,3)-B(k,3))^2);
end
d=min(C);
num=find(C==d);
if length(num)~=1
num=num(1,1);
end
for k=1:N
if k==num
count(k)=count(k)+1;
S(count(k),:,k)=A(i,j,:);
F(i,j,mod(num,3)+1)=(num-1)*(255/N);
F(i,j,mod(num+1,3)+1)=0;
F(i,j,mod(num+2,3)+1)=0;
end
end
end
end
for i=1:N
if count(i)~=0
newB(i,:)=sum(S(:,:,i))/count(i);
else
newB(i,:)=0;
end
end
e=abs(newB-B) %求出误差矩阵
B=newB;
sumcount=sum(count)
end
F=uint8(F);
figure,imshow(F);
% G=imread('QQ截图未命名.bmp');
% for i=1:w
% for j=1:h
% if (F(i,j,1)==0)&(F(i,j,2)==0)&(F(i,j,3)==0)
% G(i,j,1)=255;
% G(i,j,2)=0;
% G(i,j,3)=0;
% end
% end
% end
% figure,imshow(G);
%