目的
道理是这样,但是我们是直接用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://javaforall.net/213895.html原文链接:https://javaforall.net
