matlab程序关于k均值的means的

matlab程序关于k均值的means的,第1张

第一个for循环由于有if,所以退出时间较早。第二个for循环所需时间较长,你会看到matlab左下角有busy,表明程序没有运行结束。看着没有死循环,应该要等较长时间。另外,第二个for循环的end貌似应该在img=uint8(img)上面吧?

RGB= imread ('d:\rly.jpg')%读入像

img=rgb2gray(RGB)

[m,n]=size(img)

subplot(2,2,1),imshow(img)title(' 图一 原图像')

subplot(2,2,2),imhist(img)title(' 图二 原图像的灰度直方图')

hold off

img=double(img)

for i=1:200

c1(1)=25

c2(1)=125

c3(1)=200%选择三个初始聚类中

r=abs(img-c1(i))

g=abs(img-c2(i))

b=abs(img-c3(i))%计算各像素灰度与聚类中心的距离

r_g=r-g

g_b=g-b

r_b=r-b

n_r=find(r_g<=0&r_b<=0)%寻找最小的聚类中心

n_g=find(r_g>0&g_b<=0)%寻找中间的一个聚类中心

n_b=find(g_b>0&r_b>0)%寻找最大的聚类中心

i=i+1

c1(i)=sum(img(n_r))/length(n_r)%将所有低灰度求和取平凯祥橘均,作为下一个低灰度中心

c2(i)=sum(img(n_g))/length(n_g)%将所有低灰度求和取平均,作为下一个中间灰度中心

c3(i)=sum(img(n_b))/length(n_b)%将所有低灰度求和取平均宴激,作为盯团下一个高灰度中心

d1(i)=abs(c1(i)-c1(i-1))

d2(i)=abs(c2(i)-c2(i-1))

d3(i)=abs(c3(i)-c3(i-1))

if d1(i)<=0.001&&d2(i)<=0.001&&d3(i)<=0.001

R=c1(i)

G=c2(i)

B=c3(i)

k=i

break

end

end

R

G

B

img=uint8(img)

img(find(img<R))=0

img(find(img>R&img<G))=128

img(find(img>G))=255

subplot(2,2,3),imshow(img)title(' 图三 聚类后的图像')

subplot(2,2,4),imhist(img)title(' 图四 聚类后的图像直方图')

在聚类分析中,K-均值聚类算法(k-means

algorithm)是无监督分类中的一种基本方法,其也称为C-均值算法,其基本思想是:通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

假设要把样本集分为绝渗友c个类别,算法如下:

(1)适当选择c个类的初始中心

(2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在并槐的类,

(3)利用均值等方法更新该类的中心值

(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否喊丛则继续迭代。

下面介绍作者编写的一个分两类的程序,可以把其作为函数调用。

%%

function

[samp1,samp2]=kmeans(samp)

作为调用函数时去掉注释符

samp=[11.1506

6.7222

2.3139

5.9018

11.0827

5.7459

13.2174

13.8243

4.8005

0.9370

12.3576]

%样本集

[l0

l]=size(samp)

%%利用均值把样本分为两类,再将每类的均值作为聚类中心

th0=mean(samp)n1=0n2=0c1=0.0c1=double(c1)c2=c1for

i=1:lif

samp(i)<th0

c1=c1+samp(i)n1=n1+1elsec2=c2+samp(i)n2=n2+1endendc1=c1/n1c2=c2/n2

%初始聚类中心t=0cl1=c1cl2=c2

c11=c1c22=c2

%聚类中心while

t==0samp1=zeros(1,l)

samp2=samp1n1=1n2=1for

i=1:lif

abs(samp(i)-c11)<abs(samp(i)-c22)

samp1(n1)=samp(i)

cl1=cl1+samp(i)n1=n1+1

c11=cl1/n1elsesamp2(n2)=samp(i)

cl2=cl2+samp(i)n2=n2+1

c22=cl2/n2endendif

c11==c1

&&

c22==c2t=1endcl1=c11cl2=c22

c1=c11c2=c22

end

%samp1,samp2为聚类的结果。

初始中心值这里采用均值的办法,也可以根据问题的性质,用经验的方法来确定,或者将样本集随机分成c类,计算每类的均值。

k-均值算法需要事先知道分类的数量,这是其不足之处。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12312880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存