基于K-means聚类算法的图像分割-MatLab实现
算法的流程图
算法的流程及核心代码
1.选取初始质心:从样本点中随机抽取K个点作为质心。
2.所有样本点归类:计算所有样本点到K个质心的距离,将其划分到与其距离最近的簇中心所在簇。
3.重新确定质心:新质心=簇内所有点的均值。
4.循环更新:重复步骤2,3,直到质心不再变化。
实验结果
原始图片
处理结果
完整代码
clear;
clc;
%读取图片将其转化成灰度图片
origin_image = imread('test_01.png');
image = im2double(rgb2gray(origin_image));
clear origin_image;
%给定类别数
k = 10;
%迭代不同的次数,观察输出结果
subplot 231; imshow(image); title("原始图像");
subplot 232; imshow(kmeans(image,2,k)); title("迭代2次");
subplot 233; imshow(kmeans(image,4,k)); title("迭代4次");
subplot 234; imshow(kmeans(image,8,k)); title("迭代8次");
subplot 235; imshow(kmeans(image,16,k)); title("迭代16次");
subplot 236; imshow(kmeans(image,32,k)); title("迭代32次");
%封装的kmeans算法
function [new_image] = kmeans(image, iter_times, k)
%随机产生初始质心
randnum=randperm(length(image));
class_center=image(randnum(1:k));
%开始迭代
for i = 1:iter_times
[class_center,index] = iter_classify(image,class_center,k);
end
%构建迭代完成后的图片
new_image = contruct_image(class_center,index);
end
%分类
function [index] = classify(image,class_center,k)
[row,col] = size(image);
distance = zeros(k,row,col);
index = zeros(row,col);
for i = 1:k
distance(i,:,:) = abs(image-class_center(i));
end
%归类
for i = 1:row
for j = 1:col
tmp = distance(:,i,j);
index(i,j) = find((tmp==min(min(tmp))),1);
end
end
end
%重新计算质心,重新分类
function [new_class_center, new_index] = iter_classify(image,class_center,k)
index = classify(image,class_center,k);
new_class_center = zeros(1,k);
for i = 1:k
if(~isempty(find(index==i)==0))
new_class_center(i) = sum(image(index==i))/length(find(index==i));
else
new_class_center(i) = class_center(i);
end
end
new_index = classify(image,new_class_center,k);
end
%构建图片
function [new_image] = contruct_image(class_center,index)
[row,col] = size(index);
new_image = zeros(row,col);
for i = 1:row
for j = 1:col
new_image(i,j) = class_center(index(i,j));
end
end
end
THE END
0
二维码
海报
基于K-means聚类算法的图像分割-MatLab实现
算法的流程图
算法的流程及核心代码
1.选取初始质心:从样本点中随机抽取K个点作为质心。
2.所有样本点归类:计算所有样本点到K个质心的距离,将其划……
共有 0 条评论