(MATLAB)K均值聚类算法用于图像的分割

目的

实现将K均值聚类算法用于图像的分割(以下采用一张比较常见的图片,这张图片即为下面使用的test1.png,当然,也可采用别的图片,用小黄人做实验只是因为效果比较OK)
在这里插入图片描述
k均值聚类结果受到所选聚类中心的个数K和其初始位置以及模式样本的几何性质及读入次序等的影响。实际应用中需要试探不同的K值和选择不同的聚类中心起始值。

道理是这样,但是我们是直接用MATLAB里面的kmeans函数(用 help(‘kmeans’) 可以直接查看kmeans的相关信息),聚类起始点我们并不需要考虑。代码中我们重点关照一下K,最好把不同的K得出的效果放在同一个figure中,这样对比起来效果比较明显。此外,比较有可能影响结果的应该就是模式样本的几何性质了,也就是图片的前景背景的占比,RGB占比等等。(所以建议多试试几张图看看对比)

代码如下:

close all;
clear all;
clc;

k=2;

org = imread('test1.png');        %读入图像
figure;
subplot(2,2,1);
imshow(org),title('原始图像');    %显示原图像

% 接下来需要知道图片的尺寸(长和宽),如若直接对RGB图像进行操作,如下
% [m,n,p]=size(org)                     %m,n为所求,p=3为通道数

% 或者用下面的这种方法,转化为灰度图再求
gray=rgb2gray(org);
[m,n]=size(gray);

% 将图像进行RGB——3通道分解
% org(:, :, 1)......分别代表rgb通道
A = reshape(org(:, :, 1), m*n, 1);   
B = reshape(org(:, :, 2), m*n, 1);
C = reshape(org(:, :, 3), m*n, 1);
data = [A B C];                              % r g b分量组成样本的特征,每个样本有三个属性值,共width*height个样本

% 第二张图
% kmeans第一个参数: N*P的数据矩阵,N为数据个数,P为单个数据维度
res = kmeans(double(data), k);        
result = reshape(res, m, n);             % 反向转化为图片形式
subplot(2,2,2);
% label2rgb功能是转换标记矩阵到RGB图像
imshow(label2rgb(result)),title(strcat('K=',num2str(k),'时RGB通道分割结果'));   % 显示分割结果

% 第三张图
res = kmeans(double(data), k+1);    
result = reshape(res, m, n);     
subplot(2,2,3);
imshow(label2rgb(result)),title(strcat('K=',num2str(k+1),'时RGB通道分割结果'));   

% 第四张图
res = kmeans(double(data), k+2);    
result = reshape(res, m, n);     
subplot(2,2,4);
imshow(label2rgb(result)),title(strcat('K=',num2str(k+2),'时RGB通道分割结果'));   

结果如下

在这里插入图片描述

如果说非要讨论距离、起始点等因素的话,可以调用kmeans的另一种形式进行实现。如下。具体参数信息依然是用 help(‘kmeans’) 查看。

[...] = kmeans(...,param1,val1,param2,val2,...)

参数不清楚的可以参考这个博客

https://blog.csdn.net/wys7541/article/details/82153844
发布了28 篇原创文章 · 获赞 12 · 访问量 4143

猜你喜欢

转载自blog.csdn.net/sf9898/article/details/104137751
今日推荐