最近学习了机器学习好多传统算法,自己体会还是要自己动手实践一下才能更好的消化掉。
以Matlab自带的灰度图像rice.png为例,使用K-means算法进行聚类,求取阈值。
K-Means是基于划分的聚类算法,属于比较基本的聚类算法。
1、主要步骤
K-means算法(以划分大米灰度图像为例)
1、 读取图像,获取灰度值二维矩阵m*n
2、 转换矩阵,将二维矩阵转换成一维矩阵1*(m*n)
3、 对一维矩阵取两个中心值,作为K-means算法的初始聚类点
4、 对中心值进行聚类分析,遍历一维数组中每一个点,计算与中心点的距离,划分各个点
5、 对于聚类后的两类,重新计算中心点,重复步骤4,直到两个中心点不再改变(或者新旧距离浮动在2以内)。
6、 根据两个中心点求平均值,确定图像阈值
7、 对于阈值左右的点进行划分(小于阈值的点灰度标0,大于的点灰度标255)
2、代码实现
clear all;
rice=imread('rice.png');
[m,n]=size(rice);
global new_rice,global class1,global class2;%class表示两个聚类
k=1;
for j=1:1:n
for i=1:1:m
new_rice(k)=rice(i,j);
k=