基于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
分享
二维码
海报
基于K-means聚类算法的图像分割-MatLab实现
算法的流程图   算法的流程及核心代码 1.选取初始质心:从样本点中随机抽取K个点作为质心。 2.所有样本点归类:计算所有样本点到K个质心的距离,将其划……