基于K-means聚类算法的MATLAB图像分割

42506bb7bb94d6e4be53d09b43ed6fab.png

一、K-means聚类算法原理

K-means算法首先从数据样本中选取K个点作为初始聚类中心;其次计算各个样本到聚类的距离,把样本归到离它最近的那个聚类中心所在的类:然后计算新形成的每个聚类的数据对象的平均值来得到新的聚类中心;最后重复以上步骤,直到相邻两次的聚类中心没有任何变化,说明样本调整结束,聚类准则函数达到最优。

39d9b3c6a760f919dd6a20b976b33b0d.png

二、K-means聚类算法的要点

1.选定某种距离作为数据样本间的相似性度量

在计算数据样本之间的距离时,可以根据实际需要选择某种距离作为样本的相似性度量,距离越小,样本越相似,差异越小;距离越大,样本越不相似,差异越大。

2.聚类中心迭代终止判断条件

K-means算法在每次迭代中都要考察每个样本的分类是否正确,若不正确,则需要调整。

3.误差平方和准则函数评价聚类性能

三、基于 K-means图像分割

K-means聚类算法简捷,具有很强的搜索力,适合处理数据量大的情况,在数据挖掘

和图像处理领域中得到了广泛的应用。采用K-means进行图像分割,将图像的每个像素点的灰度或者RGB作为样本(特征向量),因此整个图像构成了一个样本集合(特征向量空间),从而把图像分割任务转换为对数据集合的聚类任务。然后,在此特征空间中运用K-means聚类算法进行图像区域分割,最后抽取图像区域的特征。

以下附上图像分割所需要的所有m文件代码。

% 1.计算样本之间距离
function D=sampledist(X,C,method)
[n,p]=size(X);
k=size(C,1);
D=zeros(n,k);
switch lower(method(1))
    case 'e' %euclidean即欧氏距离
        for i=1:k
            D(:,i)=(X(:,1)-C(i,1)).^2;
            for j=2:p
                D(:,i)=D(:,i)+(X(:,j)-C(i,j)).^2;
            end
        end
    case 'c' %cityblock即城市距离
        for i=1:k
            D(:,i)=abs(X(:,1)-C(i,1));
            for j=2:p
                D(:,i)=D(:,i)+abs(X(:,j)-C(i,j));
            end
        end
        
end
%2.提取特征向量
function vec=extractvecotr(img)
[m,n,~]=size(img);
vec=zeros(m*n,3);
img=double(img); 
for j=1:n
    for i=1:m
        %提取颜色特征
        color=img(i,j,:);
        %提取距离特征
        wx=1;wy=1;
        dist=[wx*j/n,wy*i/m];
        dist=[];
        %提取纹理特征
        texture=[];
        %组成特征向量
        vec((j-1)*m+i,:)=[color(:);dist(:);texture(:)];
    end
end
%3.搜索样本空间初始聚类中心
function C=searchintial(X,method,varargin)
    switch lower (method(1))
        case 's'
            k=varargin{1};
            C=X(randsample(size(X,1),k),:);
        case 'u'
            Xmins=min(X,[],1);
            Xmaxs=max(X,[],1);
            k=varargin{1};
            C=unifrnd(Xmins(ones(k,1),:),Xmaxs(ones(k,1),:));
    end
%4.图像聚类分割
function [F,C]=imkmeans(I,C)
if isempty(C)
    k=2;
    C=[];
elseif isscalar(C)
    k=C;
    C=[];
else
    k=size(C,1);
end
X=exactvecotr(I);
if isempty(C)
    C=searchintial(X,'sample',k);
end
Cprev=rand(size(C));
while true 
    D=sampledist(X,C,'euclidean');
    [~,locs]=min(D,[],2);
    for i=1:k
        C(i,:)=mean(X(locs==i,:),1);
    end
    if norm(C(:)-Cprev(:))<eps
        break
    end
    Cprev=C;
end


    [m,n,~]=size(I);
    F=reshape(locs,[m,n]);

需要调用的函数编辑好之后就可以读取图像进行调试和使用。

clc
close all
I=imread('IMG1.jpg');
I=double(I)/255;
subplot(2,3,1),imshow(I),title('原始图像')
 for i=2:6
F=imkmeans(I,i);
subplot(2,3,i);
imshow(F,[]);
title(['聚类个数=',num2str(i)])
end

经过2-6个聚类个数分割的结果如图所示,不同的图像可以根据情况调整聚类个数以便于达到理想效果。

a3bc8710c0f7c75405f2485fb929b60b.jpeg

以上就是今天介绍的基于K-means聚类算法的MATLAB图像分割,有需要的朋友们可以自己动手尝试,欢迎大家分享到朋友圈,让更多有需要的朋友看到!也欢迎更多MATLAB爱好者和使用者前来交流!

参考资料:

[1]陈刚、魏晗、高毫林.MATLAB在数字图像处理中的应用

[2]杨文茵、徐丽新.MATLAB R2016a数字图像处理算法分析与实现

图片来源:由作者拍摄  

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: K-means聚类算法图像分割是将一幅图像的像素点分成若干个类别,使得每个类别内的像素点具有相似的特征,而不同类别内像素点的特征差异较大。通过对每个类别进行颜色均值计算,得到每个类别的代表颜色,从而对图像进行分割。 ### 回答2: 在计算机视觉领域图像分割是非常重要的一个问题,它的目的是将一幅图像不同的像素点划分成若干个具有相似特征的集合,以便于进一步的分析和处理。 在图像分割聚类算法是一种非常常见的方法,其k-means算法是比较常用的一种。它是一种基于距离的聚类算法,其思想是将数据点分为k个簇,使得每个数据点都能被分到和其距离最近的簇。 在matlab,可以使用k-means算法对图像进行分割。具体步骤如下: 1. 将图像转换为向量形式,即将图像的每个像素点作为一个特征,得到一个n维的向量。 2. 设置聚类的个数k,即将图像分为k个簇。 3. 随机选择k个数据点作为聚类心。 4. 将每个数据点分配到距离最近的聚类心所在的簇。 5. 对每个簇重新计算聚类心。 6. 重复步骤4和步骤5,直到聚类心不再变化为止。 7. 将所有像素点分别赋值为它所属的簇的聚类心的灰度值。 由于k-means算法本身并没有考虑图像的空间信息,因此在实际应用,人们常常将图像分割成若干个重叠的小区域,然后在每个小区域使用k-means算法进行聚类,这样可以在一定程度上增加图像分割的准确性和鲁棒性。 总之,matlabk-means聚类算法图像分割方法简单易行,对于一些小规模的图像分割任务来说已经足够,但是对于一些复杂场景下的大规模图像分割任务来说,仍需要进一步优化算法,提高分割准确性和效率。 ### 回答3: K-means聚类算法是一种有效的图像分割方法。其主要思想是将一幅图像的像素点分为K个簇,每个簇代表一种颜色或亮度。算法的核心是根据相似度来将像素点分配到预定义数量的簇,然后计算每个簇的均值,并以此为新的聚类心,继续执行相似度计算和聚类操作。 Matlabk-means聚类算法图像分割具体实现方式如下: 首先,将待分割的图像转换为灰度图像,将每个像素点的灰度值作为相似度度量。然后,使用Matlab自带的k-means聚类函数kmeans,将像素点分配到K个簇,每个簇用其对应的聚类心表示。最后,根据分配结果重构图像,将同一个聚类心下的像素赋予相同的颜色或亮度值。这样就可以实现图像的分割。 Matlabk-means聚类算法图像分割具有以下优点: 1、简单而有效的算法,易于理解和实现。 2、可以根据需要进行扩展,如调整k值、修改相似度度量方式、增加附加信息等。 3、可以处理任意图像大小和维度,适用于多种图像分割问题。 4、在时间和空间复杂度方面都表现良好,可以快速处理大量数据。 综上所述,Matlabk-means聚类算法图像分割是一种有效的方法,适用于众多图像分割问题。它不仅具有高效性和灵活性,而且便于调整和扩展,可以满足不同用户的需求。因此,它是图像处理和计算机视觉领域广泛应用的算法之一。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值