基于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
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Matlab使用k-means进行图像分割的过程包括以下几个步骤: 1. 导入图像并进行预处理:首先,使用imread函数读取图像,并将其转换为double类型。然后,根据需要进行图像预处理,例如灰度化、归一化等操作。 2. 调用k-means函数:在调用k-means函数之前,需要指定k值,即要将图像分割成的区域数目。然后,通过调用kmeans函数,传入图像数据和k值,进行图像分割。 3. 可视化结果:将分割的结果可视化,可以使用subplot函数将原始图像和分割后的图像显示在同一窗口,方便对比。 下面是一个使用k-means进行图像分割Matlab代码示例: ```matlab I = imread('image.jpg'); % 读取图像 I = double(I)/255; % 转换为double类型并进行归一化 subplot(1, 2, 1); imshow(I); title('原始图像'); k = 4; % 设置k值为4 pixels = reshape(I, [], 3); % 将图像像素重塑为一个矩阵,每一行代表一个像素点的RGB值 % 使用k-means进行图像分割 = kmeans(pixels, k); % 将分割结果重塑为与原图像大小相同的矩阵 segmented_image = reshape(labels, size(I, 1), size(I, 2)); subplot(1, 2, 2); imshow(segmented_image, []); title('分割结果'); ``` 在这个示例,我们首先读取了一张图像,并将其转换为double类型。然后,我们指定了k值为4,并使用k-means函数对图像进行分割。最后,我们将原始图像和分割结果显示在同一窗口,方便对比。 请注意,这只是一个简单的示例,使用k-means算法进行图像分割可能会有其他更复杂的方法和技巧,具体的应用场景和需求可能会有不同的处理方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [matlab动手实现k均值聚类图像分割](https://blog.csdn.net/teidix/article/details/121180704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于K-means聚类算法MATLAB图像分割](https://blog.csdn.net/rz1314/article/details/129712830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值