kmeans算法的matlab实践

把图像中所有的像素点进行RGB聚类分析,然后输出看结果

 1 img = imread('qq.png');
 2 
 3 %取出R矩阵,并将这个R矩阵拉成一列
 4 imgR = img(:,:,1);
 5 imgR = imgR(:);
 6 
 7 %取出G矩阵,并将这个G矩阵拉成一列
 8 imgG = img(:,:,2);
 9 imgG = imgG(:);
10 
11 %取出B矩阵,并将这个B矩阵拉成一列
12 imgB = img(:,:,3);
13 imgB = imgB(:);
14 
15 %把R G B拼起来 每一行代表每个点的RGB值 总计有 W*H行
16 imgRGB = [imgR imgG imgB];
17 
18 %对imgRGB进行聚类算法,默认应该是欧拉距离
19 [classIndex, classRGB] = kmeans(double(imgRGB), 3);
20 classRGB = int32(classRGB);
21 
22 %把3个中心点的RGB值作为输出值,使图像只有那么3种颜色
23 for i=1:size(classIndex,1)
24    
25     if(classIndex(i) == 1)
26         imgRGB(i,:) = classRGB(1,:);
27     end
28     
29     if(classIndex(i) == 2)
30         imgRGB(i,:) = classRGB(2,:);
31 end 32 33 if(classIndex(i) == 3) 34 imgRGB(i,:) = classRGB(3,:);
35 end 36 37 end 38 39 40 %最后把数据转回图像的矩阵,显示出来 41 [height,width] = size(img); 42 width = width/3; 43 for j=1:width 44 for i=1:height 45 img(i,j,1) = imgRGB(i+(j-1)*height,1); %把R提取出来赋回去 46 img(i,j,2) = imgRGB(i+(j-1)*height,2); %把G提取出来赋回去 47 img(i,j,3) = imgRGB(i+(j-1)*height,3); %把B提取出来赋回去 48 end 49 end 50 51 imshow(img);

 

 

 

第二张是上面代码的结果

第三张用3个颜色代表了3个类

第四张,设置K为4,也即会分成4类,搞了4种颜色

 

 

posted @ 2013-10-14 22:57  华夏007  阅读(650)  评论(0)    收藏  举报