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种颜色

浙公网安备 33010602011771号