数字图像处理——K-means聚类
一、K-means聚类流程
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小
二、matlab代码
clear,clc;
Image = double(imread('1.jpg'));
[lines,samples,bands] = size(Image);
%k-means
K = 5;
A = reshape(Image(:,:,:),lines*samples,3);
Center = zeros(K,3);
center = zeros(K,3);
%初始化聚类中心
for k = 1:K
Center(k,:)= round(255*k/K);
end
Result = zeros(lines*samples,1);
while(Center~=center)
center = Center;
%按最短距离聚类
for i = 1:lines*samples
for k = 1:K
Data(k) = sqrt((A(i,1)-Center(k,1))^2+(A(i,2)-Center(k,2))^2+(A(i,3)-Center(k,3))^2);
end
[m,index] = min(Data);
Result(i,1) = index;
end
%重新计算聚类中心
for k = 1:K
indexx = find(Result == K);
for j = 1:3
Center(K,3) = mean(A(indexx,j));
end
end
end
figure(1);
subplot(1,2,1);
imshow(uint8(Image));
title('原始图像');
Image1 = reshape(Result,lines,samples);
subplot(1,2,2);
imshow(label2rgb(Image1));
title('K-means聚类分割后的影像');