图像分割——k-means算法

本文介绍了一种使用K-means算法进行图像分割的方法。通过读取图像,获取图像大小及直方图统计,设定类别数量并初始化中心点,然后通过迭代寻找最佳分割点,最终实现图像的分割并展示结果。
clc;
clear all;
close all;
%用k-means算法对图像进行分割
I=imread('D:\Gray Files\5-26.tif');
%获得图像大小
[M,N]=size(I);
%获得图像的直方图统计
hist_I=Histeq_Num(I,M,N);
%-------------------k-means算法分割----------------------------------------
%类别的数量
k=3;
%产生随机数
R=randperm(256);
%初始化中心点
m=R(1:k);
%最大误差
E=0.001;
%直方图的长度
L=length(hist_I);
B=zeros(L,1);
cat_Hist=cat(2,hist_I',B);
m_copy=m;
%开始寻找最佳分割点
flag=1;
while flag    
    for i=1:L
        if cat_Hist(i,1)~=0
            %计算每一个灰度级与中心点的欧拉距离
            D=abs(m-i);
            [C,ind_min]=min(D);
            cat_Hist(i,2)=ind_min;
        end
    end
    flag1=0;
    for v=1:k        
        %计算第一个类的中心点
        ind=find(cat_Hist(:,2)==v);
        sum=0;
        num=0;
        for j=1:length(ind)
            sum=sum+ind(j)*cat_Hist(ind(j));
            num=num+cat_Hist(ind(j));
        end
        m_copy(v)=sum/num;
        if abs(m_copy(v)-m(v))<E
            flag1=flag1+1;
        end
    end
    if flag1==3
        flag=0;
    else
        m=m_copy;
    end   
end
m=floor(m);
for i=1:L
    if cat_Hist(i,1)~=0
        ind=find(I==i);
        I(ind)=m(cat_Hist(i,2));
    end
end
imshow(I)

直方图统计函数,Histeq_Num如下:

%%%直方图计数
function [hist_I]=Histeq_Num(I,M,N)
    hist_I=zeros(1,256);
    %每一个值加1,消除零值,以与矩阵的下标对应
    I=I+1;
    %遍历图像,对每一个灰度分量进行数量统计
    for i=1:M*N
        hist_I(I(i))=hist_I(I(i))+1;
    end    
end

 

运用K-means算法进行图像分割, K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。 k个初始类聚类中心点的选取对聚类结果具有较的 公式 公式 影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。 算法过程如下: 1)从N个文档随机选取K个文档作为质心 2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 3)重新计算已经得到的各个类的质心 4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束 具体如下: 输入:k, data[n]; (1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1]; (2) 对于data[0]….data[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i; (3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数; (4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值。 折叠工作原理 K-MEANS算法的工作原理及流程 K-MEANS算法 输入:聚类个数k,以及包含 n个数据对象的数据库。 输出:满足方差最小标准的k个聚类。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值