📄 新建 文本文档 (2).txt
字号:
function [mu,mask]=kmeans1(ima,k)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% kmeans image segmentation
%
% Input:
% ima: grey color image
% k: Number of classes
% Output:
% mu: vector of class means
% mask: clasification image mask
%
% Author: Jose Vicente Manjon Herrera
% Email: jmanjon@fis.upv.es
% Date: 27-08-2005
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% check image
mask=ima;
ima=double(ima);
copy=ima; % make a copy
ima=ima(:); % vectorize ima 图像转成一个向量
mi=min(ima); % deal with negative 求图像中的最小灰度值
ima=ima-mi+1; % and zero values 图像所有值向下浮动至最小值为1
s=length(ima); % 计算向量总元素数
% create image histogram
m=max(ima)+1; %取最大像素值
h=zeros(1,m); %聚类前图像向量中各灰度出现的次数统计
hc=zeros(1,m); %聚类后图像向量所属类编号
for i=1:s
if(ima(i)>0)
h(ima(i))=h(ima(i))+1;
end
end
ind=find(h); %找到图像向量中所有出现次数非0的值
hl=length(ind); %图像向量中所有非0值的个数
% initiate centroids
mu=(1:k)*m/(k+1);%确定初始聚类中心(k个)
% start process
while(true)
oldmu=mu; %记录上一次的聚类中心
% current classification
for i=1:hl
c=abs(ind(i)-mu); %计算图像向量中每一个分量与所有聚类中心的距离
cc=find(c==min(c)); %找到图像向量中每一个分量与聚类中心距离中最短的那一个聚类中心
hc(ind(i))=cc(1); %记录图像向量中每一个分量所属的类号
end
%recalculation of means
%更新聚类中心
for i=1:k
a=find(hc==i); %找到图像向量中所有属于第i类的分量
if sum(h(a))~=0
mu(i)=sum(a.*h(a))/sum(h(a)); %更新第i类的聚类中心
end
end
%聚类中心不再变化,说明聚类结束,退出
if(mu==oldmu)
break;
end
end
% calculate mask
s=size(copy);
mask=zeros(s);
for i=1:s(1)
for j=1:s(2)
c=abs(copy(i,j)-mu);
a=find(c==min(c));
mask(i,j)=a(1);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -