K-means算法对图像处理
K-means算是图像自动分类基础的算法之一,原理参考各类书籍
代码实现步骤:
指定分成几类,设置每类的初始均值,对图像进行重新分类,分类标准就是与每个聚类均值做差值(绝对值),差值最小的聚类则归并为该聚类。全部重新归类后重新计算新聚类的均值与之前聚类均值比较,小于指定阈值,停止迭代。
程序对于单波段多波段均匹配,分波段进行聚类,直至每个波段数据聚类均达到稳定。
function data1=kmean(data ,k,T)%k指要分种类的个数,T为目标聚类重分类后均值与之前均值差的阈值,及达到稳定的阈值
[m,n,bands]=size(data);%图像数据行列
data1=zeros(m,n,bands);%矩阵存储最后的结果
data=double(data);
Min=min(min(min(data)));
Max=max(max(max(data)));
%根据图像波段设置变量,申请相应的内存空间方便计算
dis=zeros(bands,k);%数据相对聚类均值的差值
Mean=zeros(bands,k);%聚类的均值
TMean=zeros(bands,k);%聚类均值的临时变量
for i=1:k
for band=1:bands
Mean(band,i)=i/k*(Max-Min)+Min;
end
end
flag=0;
while(flag~=k*bands)%设置一个标志,当满足条件则退出循环
for i=1:m
for j=1:n
for s=1:k
for band=1:bands
dis(s,band)=abs(data(i,j,band)-Mean(band,s));
end
end
[~,index]=min(dis);
for band=1:bands
data1(i,j,band)=index(1,band);
end
end
end
flag=0;
for band=1:bands
for i=1:k%循环判断所得聚类均值是否满足要求
tdata=data(:,:,band);
tdata1=data1(:,:,band);
TMean(band,i)=mean(tdata(find(tdata1==i)));
if abs(TMean(band,i)-Mean(band,i))<=T
flag=flag+1;
end
end
end
Mean=TMean;
end
end
运行截图参考:
多波段图像(RGB图像):
分类结果:(阈值为5)
分类结果(阈值为0);
单波段(灰度化后影像):
分类结果(阈值为5):
分类结果(阈值为0):