基于kmeans聚类算法的图像分割

Kmeans之前已经讲过了,其图像分割只不过是把之前的高斯数对换成图像二维像素点,彩色图像每个像素点有rgb三个分量,灰度图像只有一个分量。

1编程实现  

<span style="font-size:14px;">clear;clc;close all;
data=imread('src1.bmp');
imshow(data)
[m,n,c]=size(data);
[mu,pattern]=k_mean_Seg(data,2);
for x=1:m
    for y=1:n
        if pattern(x,y,1)==1
            data(x,y,1)=0;
            data(x,y,2)=0;
            data(x,y,3)=255;
        elseif pattern(x,y,1)==2
            data(x,y,1)=0;
            data(x,y,2)=255;
            data(x,y,3)=0;
        elseif pattern(x,y,1)==3
            data(x,y,1)=255;
            data(x,y,2)=0;
            data(x,y,3)=0;
        else
            data(x,y,1)=255;
            data(x,y,2)=255;
            data(x,y,3)=0;
        end
    end
end
figure;
imshow(data);   
 
function [num,mask]=k_mean_Seg(src,k)
src=double(src);
img=src;        
src=src(:);      
mi=min(src);     
src=src-mi+1;    
L=length(src);
 
m=max(src)+1;
hist=zeros(1,m);
histc=zeros(1,m);
for i=1:L
  if(src(i)>0)
      hist(src(i))=hist(src(i))+1;
  end;
end
ind=find(hist);
hl=length(ind);
num=(1:k)*m/(k+1);
while(true)
  prenum=num;
  for i=1:hl
      c=abs(ind(i)-num);
      cc=find(c==min(c));
      histc(ind(i))=cc(1);
  end
  for i=1:k,
      a=find(histc==i);
      num(i)=sum(a.*hist(a))/sum(hist(a));
  end
  if(num==prenum)
      break;
  end;
 
end
L=size(img);
mask=zeros(L);
for i=1:L(1),
for j=1:L(2),
  c=abs(img(i,j)-num);
  a=find(c==min(c)); 
  mask(i,j)=a(1);
end
end
num=num+mi-1;  </span>


    

 

2结果展示

《基于kmeans聚类算法的图像分割》  《基于kmeans聚类算法的图像分割》

                                     a)原图                                                                                b)N=2

《基于kmeans聚类算法的图像分割》 《基于kmeans聚类算法的图像分割》

c)N=3                                                                         d)N=4

对于灰度图像,用data=rgb2gray(data); 转化成为成为灰度图像后面的显示换成如下:

for x=1:m

    for y=1:n

        if pattern(x,y)==1

            data(x,y)=0;

        elseif pattern(x,y)==2

            data(x,y,1)=80;

        elseif pattern(x,y)==3

            data(x,y)=180;

        else

            data(x,y)=255;

        end

    end

end

《基于kmeans聚类算法的图像分割》 《基于kmeans聚类算法的图像分割》

a)原图                                                                                b)N=2

《基于kmeans聚类算法的图像分割》 《基于kmeans聚类算法的图像分割》

c)N=3                                                                         d)N=4

    原文作者:聚类算法
    原文地址: https://blog.csdn.net/hustlx/article/details/50849585
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞