clc;
clear all;
close all;
%用k-means算法对图像进行分割
I=imread('D:\Gray Files\5-26.tif');
%获得图像大小
[M,N]=size(I);
%获得图像的直方图统计
hist_I=Histeq_Num(I,M,N);
%-------------------k-means算法分割----------------------------------------
%类别的数量
k=3;
%产生随机数
R=randperm(256);
%初始化中心点
m=R(1:k);
%最大误差
E=0.001;
%直方图的长度
L=length(hist_I);
B=zeros(L,1);
cat_Hist=cat(2,hist_I',B);
m_copy=m;
%开始寻找最佳分割点
flag=1;
while flag
for i=1:L
if cat_Hist(i,1)~=0
%计算每一个灰度级与中心点的欧拉距离
D=abs(m-i);
[C,ind_min]=min(D);
cat_Hist(i,2)=ind_min;
end
end
flag1=0;
for v=1:k
%计算第一个类的中心点
ind=find(cat_Hist(:,2)==v);
sum=0;
num=0;
for j=1:length(ind)
sum=sum+ind(j)*cat_Hist(ind(j));
num=num+cat_Hist(ind(j));
end
m_copy(v)=sum/num;
if abs(m_copy(v)-m(v))<E
flag1=flag1+1;
end
end
if flag1==3
flag=0;
else
m=m_copy;
end
end
m=floor(m);
for i=1:L
if cat_Hist(i,1)~=0
ind=find(I==i);
I(ind)=m(cat_Hist(i,2));
end
end
imshow(I)
直方图统计函数,Histeq_Num如下:
%%%直方图计数
function [hist_I]=Histeq_Num(I,M,N)
hist_I=zeros(1,256);
%每一个值加1,消除零值,以与矩阵的下标对应
I=I+1;
%遍历图像,对每一个灰度分量进行数量统计
for i=1:M*N
hist_I(I(i))=hist_I(I(i))+1;
end
end
本文介绍了一种使用K-means算法进行图像分割的方法。通过读取图像,获取图像大小及直方图统计,设定类别数量并初始化中心点,然后通过迭代寻找最佳分割点,最终实现图像的分割并展示结果。
2969

被折叠的 条评论
为什么被折叠?



