www.gusucode.com > MATLAB编程聚类实现图像的分类采用C均值算法源码程序 > 图像识别-聚类/实验程序/kmeans4gui.m

    function varargout = kmeans4gui(varargin)
% KMEANS4GUI M-file for kmeans4gui.fig
%      KMEANS4GUI, by itself, creates a new KMEANS4GUI or raises the existing
%      singleton*.
%
%      H = KMEANS4GUI returns the handle to a new KMEANS4GUI or the handle to
%      the existing singleton*.
%
%      KMEANS4GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in KMEANS4GUI.M with the given input arguments.
%
%      KMEANS4GUI('Property','Value',...) creates a new KMEANS4GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before kmeans4gui_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to kmeans4gui_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help kmeans4gui

% Last Modified by GUIDE v2.5 05-Jun-2011 20:27:27

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @kmeans4gui_OpeningFcn, ...
                   'gui_OutputFcn',  @kmeans4gui_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before kmeans4gui is made visible.
function kmeans4gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to kmeans4gui (see VARARGIN)

% Choose default command line output for kmeans4gui
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes kmeans4gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = kmeans4gui_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;



function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a double


% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global RGB;
[filename, pathname] = uigetfile( ...
{'*.bmp;*.jpg;*.png;*.jpeg', 'Image Files (*.bmp, *.jpg, *.png,*.jpeg)'; ...
'*.*', 'All Files (*.*)'}, ...
'Pick an image');
axes1=handles.axes1;
axes(handles.axes1);%用axes命令设定当前操作的坐标轴是axes_src
fpath=[pathname filename];%将文件名和目录名组合成一个完整的路径
RGB=imread(fpath);
imshow(RGB);


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global RGB;
global leibie;

 
RR=RGB(:,:,1);         
GG=RGB(:,:,2);
BB=RGB(:,:,3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          4类
if leibie==1
   k=4;
   for i=1:k
     j=randi(1,1,(size(RGB,1)-1))+1;
     m=randi(1,1,(size(RGB,2)-1))+1;
     r =RR(j,m);%得到R G B分量,为行向量
     g =GG(j,m);
     b =BB(j,m);
     z(i,:)=double([r g b]);
   end

        
%%
   a=1;
   b=1;
   c=1;
   d=1;
   num_die=0;
   while (a||b||c||d)

    set(handles.edit3,'string',num2str(num_die));
  
    axes5=handles.axes5;
    axes(handles.axes5);
    %对m,n,l,z_after进行初始化
    m=1;
    n=1;
    l=1;
    p=1;
    z1_after=double(z(1,:));
    z2_after=double(z(2,:));
    z3_after=double(z(3,:));
    z4_after=double(z(4,:));
    for i=1:size(RGB,1)
      for j=1:size(RGB,2)
        u1=double(RR(i,j));
        u2=double(GG(i,j));
        u3=double(BB(i,j));
        u=double([u1 u2 u3]);

        
        D1=(u(1,1)-z(1,1))^2+(u(1,2)-z(1,2))^2+(u(1,3)-z(1,3))^2;
        D2=(u(1,1)-z(2,1))^2+(u(1,2)-z(2,2))^2+(u(1,3)-z(2,3))^2;
        D3=(u(1,1)-z(3,1))^2+(u(1,2)-z(3,2))^2+(u(1,3)-z(3,3))^2;
        D4=(u(1,1)-z(4,1))^2+(u(1,2)-z(4,2))^2+(u(1,3)-z(4,3))^2;
        if (D1<D2)&&(D1<D3)&&(D1<D4)%属于第一类
            resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
%             z1_after=z1+(RR(i,j);GG(i,j);BB(i,j));
            %更新z1类
%             z1_after=double(z1);
            z1_after(1,1)=double(z1_after(1,1)+u(1,1));
            z1_after(1,2)=double(z1_after(1,2)+u(1,2));
            z1_after(1,3)=double(z1_after(1,3)+u(1,3));
      
            m=m+1;
%             z1_after=double(z1_after/m);
            
        elseif((D2<D1)&&(D2<D3))&&(D2<D4)%属于第二类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
             %更新z2类
%             z2_after=double(z2);
            z2_after(1,1)=double(z2_after(1,1)+u(1,1));
            z2_after(1,2)=double(z2_after(1,2)+u(1,2));
            z2_after(1,3)=double(z2_after(1,3)+u(1,3));
            n=n+1;
%             z2_after=double(z2_after/n);
      
        elseif(D3<D2)&&(D3<D1)&&(D3<D4)%属于第三类
            resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
             %更新z3类
%             z3_after=double(z3);
            z3_after(1,1)=double(z3_after(1,1)+u(1,1));
            z3_after(1,2)=double(z3_after(1,2)+u(1,2));
            z3_after(1,3)=double(z3_after(1,3)+u(1,3));
            l=l+1;
%             z3_after=double(z3_after/l);
        else
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第四类
            z4_after(1,1)=double(z4_after(1,1)+u(1,1));
            z4_after(1,2)=double(z4_after(1,2)+u(1,2));
            z4_after(1,3)=double(z4_after(1,3)+u(1,3));
            p=p+1;
        end
        
        
      end
    end
    z1_after=double(z1_after/m);
    z2_after=double(z2_after/n);
    z3_after=double(z3_after/l);
    z4_after=double(z4_after/p);
    
 %计算新的聚类中心,并显示迭代一次后的图像

 %将新的到的聚类中心与上次的聚类中心相比较,如果相同,则循环结束
   
    
     if ((z1_after(1,1)-z(1,1))^2+(z1_after(1,2)-z(1,2))^2+(z1_after(1,3)-z(1,3))^2<=0.01)
        a=0;
     else
         a=1;
     end
     if ((z2_after(1,1)-z(2,1))^2+(z2_after(1,2)-z(2,2))^2+(z2_after(1,3)-z(2,3))^2<=0.01)
         b=0;
     else
         b=1;
     end
     if ((z3_after(1,1)-z(3,1))^2+(z3_after(1,2)-z(3,2))^2+(z3_after(1,3)-z(3,3))^2<=0.01)
         c=0;
     else
         c=1;
     end
     if ((z4_after(1,1)-z(4,1))^2+(z4_after(1,2)-z(4,2))^2+(z4_after(1,3)-z(4,3))^2<=0.01)
         d=0;
     else
         d=1;
     z(1,:)=z1_after;
     z(2,:)=z2_after;
     z(3,:)=z3_after;
     z(4,:)=z4_after;
     end
%      figure;
%      
%      
%  
%      for i=1:size(RGB,1)
%          for j=1:size(RGB,2)
%                 if (resIm(i,j,1)==255)&&(resIm(i,j,2)==0)&&(resIm(i,j,3)==0)
%                     plot3(resIm(i,j,1),resIm(i,j,2),resIm(i,j,3),'r*');
%                     hold on;
%                 elseif (resIm(i,j,1)==0)&&(resIm(i,j,2)==255)&&(resIm(i,j,3)==0)
%                     plot3(resIm(i,j,1),resIm(i,j,2),resIm(i,j,3),'b+');
%                     hold on;
%                 elseif (resIm(i,j,1)==0)&&(resIm(i,j,2)==0)&&(resIm(i,j,3)==255)
%                     plot3(resIm(i,j,1),resIm(i,j,2),resIm(i,j,3),'gx');
%                     hold on;
%                 else
%                     plot3(resIm(i,j,1),resIm(i,j,2),resIm(i,j,3),'k.');
%                     hold on;
%                 end
%          end
%      end
%      xlabel('R');
%      ylabel('G');
%      zlabel('B');
%      axis square;
%      grid on;
%      view(3);

%      plot3(z(1,1),z(1,2),z(1,3));
%      plot3(z(2,1),z(2,2),z(2,3));
%      plot3(z(3,1),z(3,2),z(3,3));
%      plot3(z(4,1),z(4,2),z(4,3));
     imshow(resIm);
  
    if (num_die<50)
        num_die=num_die+1;
    else
        a=0;b=0;c=0;d=0;
    end

   
   end
   figure('Name','4类中心,特征(R,G,B)','NumberTitle','off');
   imshow(resIm);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    4类+xy
elseif  leibie==2
     k=4;
for i=1:k
     j=randi(1,1,(size(RGB,1)-1))+1;
     m=randi(1,1,(size(RGB,2)-1))+1;
     r =RR(j,m);%得到R G B分量,为行向量
     g =GG(j,m);
     b =BB(j,m);
     x(i,:)=[j m];
     z(i,:)=double([r g b]);
end

        
%%
%进行迭代计算


% z1_after=0;
% z2_after=0;
% z3_after=0;
a=1;
b=1;
c=1;
d=1;
num_die=0;

while (a||b||c||d)
    set(handles.edit3,'string',num2str(num_die));
    axes2=handles.axes2;
    axes(handles.axes2);
    %对m,n,l,z_after进行初始化
    m=1;
    n=1;
    l=1;
    p=1;
    z1_after=double(z(1,:));
    z2_after=double(z(2,:));
    z3_after=double(z(3,:));
    z4_after=double(z(4,:));
    
    x1_after=double(x(1,:));
    x2_after=double(x(2,:));
    x3_after=double(x(3,:));
    x4_after=double(x(4,:));
    
for i=1:size(RGB,1)
    for j=1:size(RGB,2)
        u1=double(RR(i,j));
        u2=double(GG(i,j));
        u3=double(BB(i,j));
        u=double([u1 u2 u3]);

%         a=u(1,1)
%         b=z(1,1)
%         c=double(a-b)
%         c^2
%         d=(double(u(1,2)-z(1,2)))^2
%         (u(1,3)-z(1,3))^2
       
        D1=(double(u(1,1)-z(1,1)))^2+(double(u(1,2)-z(1,2)))^2+(double(u(1,3)-z(1,3)))^2;
        D2=(double(u(1,1)-z(2,1)))^2+(double(u(1,2)-z(2,2)))^2+(double(u(1,3)-z(2,3)))^2;
        D3=(double(u(1,1)-z(3,1)))^2+(double(u(1,2)-z(3,2)))^2+(double(u(1,3)-z(3,3)))^2;
        D4=(double(u(1,1)-z(4,1)))^2+(double(u(1,2)-z(4,2)))^2+(double(u(1,3)-z(4,3)))^2;
        
        D5=(x(1,1)-i)^2+(x(1,2)-j)^2;
        D6=(x(2,1)-i)^2+(x(2,2)-j)^2;
        D7=(x(3,1)-i)^2+(x(3,2)-j)^2;
        D8=(x(4,1)-i)^2+(x(4,2)-j)^2;
        if (D1<D2)&&(D1<D3)&&(D1<D4)&&(D5<D6)&&(D5<D7)&&(D5<D8)%属于第一类
            resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
%             z1_after=z1+(RR(i,j);GG(i,j);BB(i,j));
            %更新z1类
%             z1_after=double(z1);
            z1_after(1,1)=double(z1_after(1,1)+u(1,1));
            z1_after(1,2)=double(z1_after(1,2)+u(1,2));
            z1_after(1,3)=double(z1_after(1,3)+u(1,3));
            x1_after(1,1)=double(x1_after(1,1)+i);
            x1_after(1,2)=double(x1_after(1,2)+j);
            m=m+1;
%             z1_after=double(z1_after/m);
            
        elseif((D2<D1)&&(D2<D3))&&(D2<D4)&&(D6<D5)&&(D6<D7)&&(D6<D8)%属于第二类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
             %更新z2类
%             z2_after=double(z2);
            z2_after(1,1)=double(z2_after(1,1)+u(1,1));
            z2_after(1,2)=double(z2_after(1,2)+u(1,2));
            z2_after(1,3)=double(z2_after(1,3)+u(1,3));
            x2_after(1,1)=double(x2_after(1,1)+i);
            x2_after(1,2)=double(x2_after(1,2)+j);
            n=n+1;
%             z2_after=double(z2_after/n);
      
        elseif(D3<D2)&&(D3<D1)&&(D3<D4)&&(D7<D5)&&(D7<D6)&&(D7<D8)%属于第三类
            resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
             %更新z3类
%             z3_after=double(z3);
            z3_after(1,1)=double(z3_after(1,1)+u(1,1));
            z3_after(1,2)=double(z3_after(1,2)+u(1,2));
            z3_after(1,3)=double(z3_after(1,3)+u(1,3));
            x3_after(1,1)=double(x3_after(1,1)+i);
            x3_after(1,2)=double(x3_after(1,2)+j);
            l=l+1;
%             z3_after=double(z3_after/l);
        else
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第四类
            z4_after(1,1)=double(z4_after(1,1)+u(1,1));
            z4_after(1,2)=double(z4_after(1,2)+u(1,2));
            z4_after(1,3)=double(z4_after(1,3)+u(1,3));
            x4_after(1,1)=double(x4_after(1,1)+i);
            x4_after(1,2)=double(x4_after(1,2)+j);
            p=p+1;
        end
       
        
    end
end
    z1_after=double(z1_after/m);
    z2_after=double(z2_after/n);
    z3_after=double(z3_after/l);
    z4_after=double(z4_after/p);
    x1_after=double(x1_after/m);
    x2_after=double(x2_after/n);
    x3_after=double(x3_after/l);
    x4_after=double(x4_after/p);
 
 %计算新的聚类中心,并显示迭代一次后的图像

 %将新的到的聚类中心与上次的聚类中心相比较,如果相同,则循环结束
      if ((z1_after(1,1)-z(1,1))^2+(z1_after(1,2)-z(1,2))^2+(z1_after(1,3)-z(1,3))^2+(x1_after(1,1)-x(1,1))^2+(x1_after(1,2)-x(1,2))^2<=0.01)
        a=0;
     else
         a=1;
     end
     if ((z2_after(1,1)-z(2,1))^2+(z2_after(1,2)==z(2,2))^2+(z2_after(1,3)-z(2,3))^2+(x2_after(1,1)-x(2,1))^2+(x2_after(1,2)-x(2,2))^2<=0.01)
         b=0;
     else
         b=1;
     end
     if ((z3_after(1,1)-z(3,1))^2+(z3_after(1,2)-z(3,2))^2+(z3_after(1,3)-z(3,3))^2+(x3_after(1,1)-x(3,1))^2+(x3_after(1,2)-x(3,2))^2<=0.01)
         c=0;
     else
         c=1;
     end
     if ((z4_after(1,1)-z(4,1))^2+(z4_after(1,2)-z(4,2))^2+(z4_after(1,3)-z(4,3))^2+(x4_after(1,1)-x(4,1))^2+(x4_after(1,2)-x(4,2))^2<=0.01)
         d=0;
     else
         d=1;
     z(1,:)=z1_after;
     z(2,:)=z2_after;
     z(3,:)=z3_after;
     z(4,:)=z4_after;
     x(1,:)=x1_after;
     x(2,:)=x2_after;
     x(3,:)=x3_after;
     x(4,:)=x4_after;
     end
     imshow(resIm);

     if (num_die<50)
        num_die=num_die+1;
     else
       a=0;b=0;c=0;d=0;
     end
end
    figure('Name','4类中心,特征(R,G,B,X,Y)','NumberTitle','off');
    imshow(resIm);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    5类
elseif leibie==5
    k=5;
for i=1:5
     j=randi(1,1,(size(RGB,1)-1))+1;
     m=randi(1,1,(size(RGB,2)-1))+1;
     r =RR(j,m);%得到R G B分量,为行向量
     g =GG(j,m);
     b =BB(j,m);
 
     z(i,:)=double([r g b]);
end

        
%%
%进行迭代计算


% z1_after=0;
% z2_after=0;
% z3_after=0;
a=1;
b=1;
c=1;
d=1;
e=1;
num_die=0;

while (a||b||c||d||e)
    set(handles.edit3,'string',num2str(num_die));
    axes2=handles.axes3;
    axes(handles.axes3);
    %对m,n,l,z_after进行初始化
    m=1;
    n=1;
    l=1;
    p=1;
    q=1;
    
    z1_after=double(z(1,:));
    z2_after=double(z(2,:));
    z3_after=double(z(3,:));
    z4_after=double(z(4,:));
    z5_after=double(z(5,:));
    
%     x1_after=double(x(1,:));
%     x2_after=double(x(2,:));
%     x3_after=double(x(3,:));
%     x4_after=double(x(4,:));
%     x5_after=double(x(5,:));
    
for i=1:size(RGB,1)
    for j=1:size(RGB,2)
        u1=double(RR(i,j));
        u2=double(GG(i,j));
        u3=double(BB(i,j));
        u=double([u1 u2 u3]);

%         a=u(1,1)
%         b=z(1,1)
%         c=double(a-b)
%         c^2
%         d=(double(u(1,2)-z(1,2)))^2
%         (u(1,3)-z(1,3))^2
       %第一类
        D1=(double(u(1,1)-z(1,1)))^2+(double(u(1,2)-z(1,2)))^2+(double(u(1,3)-z(1,3)))^2;
        %第二类
        D2=(double(u(1,1)-z(2,1)))^2+(double(u(1,2)-z(2,2)))^2+(double(u(1,3)-z(2,3)))^2;
        %第三类
        D3=(double(u(1,1)-z(3,1)))^2+(double(u(1,2)-z(3,2)))^2+(double(u(1,3)-z(3,3)))^2;
        %第四类
        D4=(double(u(1,1)-z(4,1)))^2+(double(u(1,2)-z(4,2)))^2+(double(u(1,3)-z(4,3)))^2;
        %第五类
        DD1=(double(u(1,1)-z(5,1)))^2+(double(u(1,2)-z(5,2)))^2+(double(u(1,3)-z(5,3)))^2;
        

        
        if (D1<D2)&&(D1<D3)&&(D1<D4)&&(D1<DD1)
%             &&(D5<D6)&&(D5<D7)&&(D5<D8)&&(D5<DD5)%属于第一类
            resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
%             z1_after=z1+(RR(i,j);GG(i,j);BB(i,j));
            %更新z1类
%             z1_after=double(z1);
            z1_after(1,1)=double(z1_after(1,1)+u(1,1));
            z1_after(1,2)=double(z1_after(1,2)+u(1,2));
            z1_after(1,3)=double(z1_after(1,3)+u(1,3));
%             x1_after(1,1)=double(x1_after(1,1)+i);
%             x1_after(1,2)=double(x1_after(1,2)+j);
            m=m+1;
%             z1_after=double(z1_after/m);
            
        elseif((D2<D1)&&(D2<D3))&&(D2<D4)&&(D2<DD1)
%             &&(D6<D5)&&(D6<D7)&&(D6<D8)&&(D6<DD5)%属于第二类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
             %更新z2类
%             z2_after=double(z2);
            z2_after(1,1)=double(z2_after(1,1)+u(1,1));
            z2_after(1,2)=double(z2_after(1,2)+u(1,2));
            z2_after(1,3)=double(z2_after(1,3)+u(1,3));
%             x2_after(1,1)=double(x2_after(1,1)+i);
%             x2_after(1,2)=double(x2_after(1,2)+j);
            n=n+1;
%             z2_after=double(z2_after/n);
      
        elseif(D3<D2)&&(D3<D1)&&(D3<D4)&&(D3<DD1)
%             &&(D7<D5)&&(D7<D6)&&(D7<D8)&&(D7<DD5)%属于第三类
            resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
             %更新z3类
%             z3_after=double(z3);
            z3_after(1,1)=double(z3_after(1,1)+u(1,1));
            z3_after(1,2)=double(z3_after(1,2)+u(1,2));
            z3_after(1,3)=double(z3_after(1,3)+u(1,3));
%             x3_after(1,1)=double(x3_after(1,1)+i);
%             x3_after(1,2)=double(x3_after(1,2)+j);
            l=l+1;
%             z3_after=double(z3_after/l);
        elseif(D4<D1)&&(D4<D2)&&(D4<D3)&&(D4<DD1)
%             &&(D8<D5)&&(D8<D6)&&(D8<D7)&&(D8<DD5)%属于第四类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第四类
            z4_after(1,1)=double(z4_after(1,1)+u(1,1));
            z4_after(1,2)=double(z4_after(1,2)+u(1,2));
            z4_after(1,3)=double(z4_after(1,3)+u(1,3));
%             x4_after(1,1)=double(x4_after(1,1)+i);
%             x4_after(1,2)=double(x4_after(1,2)+j);
            p=p+1;
           
        else%属于第五类
             resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
            %更新第五类
            z5_after(1,1)=double(z5_after(1,1)+u(1,1));
            z5_after(1,2)=double(z5_after(1,2)+u(1,2));
            z5_after(1,3)=double(z5_after(1,3)+u(1,3));
%             x5_after(1,1)=double(x5_after(1,1)+i);
%             x5_after(1,2)=double(x5_after(1,2)+j);
            q=q+1;
        end
       
        
    end
end
    z1_after=double(z1_after/m);
    z2_after=double(z2_after/n);
    z3_after=double(z3_after/l);
    z4_after=double(z4_after/p);
    z5_after=double(z5_after/q);

%  
 %计算新的聚类中心,并显示迭代一次后的图像

 %将新的到的聚类中心与上次的聚类中心相比较,如果相同,则循环结束
     if ((z1_after(1,1)-z(1,1))^2+(z1_after(1,2)-z(1,2))^2+(z1_after(1,3)-z(1,3))^2<=0.01)
        a=0;
     else
         a=1;
     end
     if ((z2_after(1,1)-z(2,1))^2+(z2_after(1,2)==z(2,2))^2+(z2_after(1,3)-z(2,3))^2<=0.01)
         b=0;
     else
         b=1;
     end
     if ((z3_after(1,1)-z(3,1))^2+(z3_after(1,2)-z(3,2))^2+(z3_after(1,3)-z(3,3))^2<=0.01)
         c=0;
     else
         c=1;
     end
     if ((z4_after(1,1)-z(4,1))^2+(z4_after(1,2)-z(4,2))^2+(z4_after(1,3)-z(4,3))^2<=0.01)
         d=0;
     else
         d=1;
     end
     if ((z5_after(1,1)-z(5,1))^2+(z5_after(1,2)-z(5,2))^2+(z5_after(1,3)-z(5,3))^2<=0.01)
         e=0;
     else
         e=1;
         
     z(1,:)=z1_after;
     z(2,:)=z2_after;
     z(3,:)=z3_after;
     z(4,:)=z4_after;
     z(5,:)=z5_after;
     

     end
     imshow(resIm);
     if num_die<=50
         num_die=num_die+1;
     else
        a=0;b=0;c=0;d=0;
     end

    
end
figure('Name','5类中心,特征(R,G,B)','NumberTitle','off');
    imshow(resIm);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    5类+xy
elseif leibie==3
    k=5;
    for i=1:k
     j=randi(1,1,(size(RGB,1)-1))+1;
     m=randi(1,1,(size(RGB,2)-1))+1;
     r =RR(j,m);%得到R G B分量,为行向量
     g =GG(j,m);
     b =BB(j,m);
     x(i,:)=[j m];
     z(i,:)=double([r g b]);
    end

        
%%
%进行迭代计算

    a=1;
    b=1;
    c=1;
    d=1;
    e=1;
    num_die=0;

 while (a||b||c||d||e)
    set(handles.edit3,'string',num2str(num_die));
    axes4=handles.axes4;
    axes(handles.axes4);
    %对m,n,l,z_after进行初始化
    m=1;
    n=1;
    l=1;
    p=1;
    q=1;
    
    z1_after=double(z(1,:));
    z2_after=double(z(2,:));
    z3_after=double(z(3,:));
    z4_after=double(z(4,:));
    z5_after=double(z(5,:));
    
    x1_after=double(x(1,:));
    x2_after=double(x(2,:));
    x3_after=double(x(3,:));
    x4_after=double(x(4,:));
    x5_after=double(x(5,:));
    
  for i=1:size(RGB,1)
      for j=1:size(RGB,2)
        u1=double(RR(i,j));
        u2=double(GG(i,j));
        u3=double(BB(i,j));
        u=double([u1 u2 u3]);


       %第一类
        D1=(double(u(1,1)-z(1,1)))^2+(double(u(1,2)-z(1,2)))^2+(double(u(1,3)-z(1,3)))^2+(x(1,1)-i)^2+(x(1,2)-j)^2;
        %第二类
        D2=(double(u(1,1)-z(2,1)))^2+(double(u(1,2)-z(2,2)))^2+(double(u(1,3)-z(2,3)))^2+(x(2,1)-i)^2+(x(2,2)-j)^2;
        %第三类
        D3=(double(u(1,1)-z(3,1)))^2+(double(u(1,2)-z(3,2)))^2+(double(u(1,3)-z(3,3)))^2+(x(3,1)-i)^2+(x(3,2)-j)^2;
        %第四类
        D4=(double(u(1,1)-z(4,1)))^2+(double(u(1,2)-z(4,2)))^2+(double(u(1,3)-z(4,3)))^2+(x(4,1)-i)^2+(x(4,2)-j)^2;
        %第五类
        DD1=(double(u(1,1)-z(5,1)))^2+(double(u(1,2)-z(5,2)))^2+(double(u(1,3)-z(5,3)))^2+(x(5,1)-i)^2+(x(5,2)-j)^2;

        if (D1<D2)&&(D1<D3)&&(D1<D4)&&(D1<DD1)
%             &&(D5<D6)&&(D5<D7)&&(D5<D8)&&(D5<DD5)%属于第一类
            resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
%             z1_after=z1+(RR(i,j);GG(i,j);BB(i,j));
            %更新z1类
%             z1_after=double(z1);
            z1_after(1,1)=double(z1_after(1,1)+u(1,1));
            z1_after(1,2)=double(z1_after(1,2)+u(1,2));
            z1_after(1,3)=double(z1_after(1,3)+u(1,3));
            x1_after(1,1)=double(x1_after(1,1)+i);
            x1_after(1,2)=double(x1_after(1,2)+j);
            m=m+1;
%             z1_after=double(z1_after/m);
            
        elseif((D2<D1)&&(D2<D3))&&(D2<D4)&&(D2<DD1)
%             &&(D6<D5)&&(D6<D7)&&(D6<D8)&&(D6<DD5)%属于第二类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
             %更新z2类
%             z2_after=double(z2);
            z2_after(1,1)=double(z2_after(1,1)+u(1,1));
            z2_after(1,2)=double(z2_after(1,2)+u(1,2));
            z2_after(1,3)=double(z2_after(1,3)+u(1,3));
            x2_after(1,1)=double(x2_after(1,1)+i);
            x2_after(1,2)=double(x2_after(1,2)+j);
            n=n+1;
%             z2_after=double(z2_after/n);
      
        elseif(D3<D2)&&(D3<D1)&&(D3<D4)&&(D3<DD1)
%             &&(D7<D5)&&(D7<D6)&&(D7<D8)&&(D7<DD5)%属于第三类
            resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
             %更新z3类
%             z3_after=double(z3);
            z3_after(1,1)=double(z3_after(1,1)+u(1,1));
            z3_after(1,2)=double(z3_after(1,2)+u(1,2));
            z3_after(1,3)=double(z3_after(1,3)+u(1,3));
            x3_after(1,1)=double(x3_after(1,1)+i);
            x3_after(1,2)=double(x3_after(1,2)+j);
            l=l+1;
%             z3_after=double(z3_after/l);
        elseif(D4<D1)&&(D4<D2)&&(D4<D3)&&(D4<DD1)
%             &&(D8<D5)&&(D8<D6)&&(D8<D7)&&(D8<DD5)%属于第四类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第四类
            z4_after(1,1)=double(z4_after(1,1)+u(1,1));
            z4_after(1,2)=double(z4_after(1,2)+u(1,2));
            z4_after(1,3)=double(z4_after(1,3)+u(1,3));
            x4_after(1,1)=double(x4_after(1,1)+i);
            x4_after(1,2)=double(x4_after(1,2)+j);
            p=p+1;
           
        else%属于第五类
             resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
            %更新第五类
            z5_after(1,1)=double(z5_after(1,1)+u(1,1));
            z5_after(1,2)=double(z5_after(1,2)+u(1,2));
            z5_after(1,3)=double(z5_after(1,3)+u(1,3));
            x5_after(1,1)=double(x5_after(1,1)+i);
            x5_after(1,2)=double(x5_after(1,2)+j);
            q=q+1;
        end
       
      end
  end

    z1_after=double(z1_after/m);
    z2_after=double(z2_after/n);
    z3_after=double(z3_after/l);
    z4_after=double(z4_after/p);
    z5_after=double(z5_after/q);
    
    x1_after=double(x1_after/m);
    x2_after=double(x2_after/n);
    x3_after=double(x3_after/l);
    x4_after=double(x4_after/p);
    x5_after=double(x5_after/q);
 
 %计算新的聚类中心,并显示迭代一次后的图像

 %将新的到的聚类中心与上次的聚类中心相比较,如果相同,则循环结束
     if ((z1_after(1,1)-z(1,1))^2+(z1_after(1,2)-z(1,2))^2+(z1_after(1,3)-z(1,3))^2+(x1_after(1,1)-x(1,1))^2+(x1_after(1,2)-x(1,2))^2<=0.01)
        a=0;
     else
         a=1;
     end
     if ((z2_after(1,1)-z(2,1))^2+(z2_after(1,2)==z(2,2))^2+(z2_after(1,3)-z(2,3))^2+(x2_after(1,1)-x(2,1))^2+(x2_after(1,2)-x(2,2))^2<=0.01)
         b=0;
     else
         b=1;
     end
     if ((z3_after(1,1)-z(3,1))^2+(z3_after(1,2)-z(3,2))^2+(z3_after(1,3)-z(3,3))^2+(x3_after(1,1)-x(3,1))^2+(x3_after(1,2)-x(3,2))^2<=0.01)
         c=0;
     else
         c=1;
     end
     if ((z4_after(1,1)-z(4,1))^2+(z4_after(1,2)-z(4,2))^2+(z4_after(1,3)-z(4,3))^2+(x4_after(1,1)-x(4,1))^2+(x4_after(1,2)-x(4,2))^2<=0.01)
         d=0;
     else
         d=1;
     end
     if ((z5_after(1,1)-z(5,1))^2+(z5_after(1,2)-z(5,2))^2+(z5_after(1,3)-z(5,3))^2+(x5_after(1,1)-x(5,1))^2+(x5_after(1,2)-x(5,2))^2<=0.01)
         e=0;
     else
         e=1;
         
     z(1,:)=z1_after;
     z(2,:)=z2_after;
     z(3,:)=z3_after;
     z(4,:)=z4_after;
     z(5,:)=z5_after;
     
     x(1,:)=x1_after;
     x(2,:)=x2_after;
     x(3,:)=x3_after;
     x(4,:)=x4_after;
     x(5,:)=x5_after;
     end
     imshow(resIm);
     if (num_die<50)
         num_die=num_die+1;
     else
        a=0;b=0;c=0;d=0;e=0;
     end
 end
    

   figure('Name','5类中心,特征(R,G,B,X,Y)','NumberTitle','off');
   imshow(resIm);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  8类
elseif leibie==6
k=8;
for i=1:8
     j=randi(1,1,(size(RGB,1)-1))+1;
     m=randi(1,1,(size(RGB,2)-1))+1;
     r =RR(j,m);%得到R G B分量,为行向量
     g =GG(j,m);
     b =BB(j,m);

     z(i,:)=double([r g b]);
end

        
%%
%进行迭代计算


% z1_after=0;
% z2_after=0;
% z3_after=0;
a=1;
b=1;
c=1;
d=1;
e=1;
f=1;
g=1;
h=1;
num_die=0;

while (a||b||c||d||e||f||g||h)
    set(handles.edit3,'string',num2str(num_die));
    axes6=handles.axes6;
    axes(handles.axes6);
    %对m,n,l,z_after进行初始化
    m=1;
    n=1;
    l=1;
    p=1;
    q=1;
    mm=1;
    nn=1;
    pp=1;
    
    z1_after=double(z(1,:));
    z2_after=double(z(2,:));
    z3_after=double(z(3,:));
    z4_after=double(z(4,:));
    z5_after=double(z(5,:));
    z6_after=double(z(6,:));
    z7_after=double(z(7,:));
    z8_after=double(z(8,:));

    
for i=1:size(RGB,1)
    for j=1:size(RGB,2)
        u1=double(RR(i,j));
        u2=double(GG(i,j));
        u3=double(BB(i,j));
        u=double([u1 u2 u3]);


       %第一类
        D1=(double(u(1,1)-z(1,1)))^2+(double(u(1,2)-z(1,2)))^2+(double(u(1,3)-z(1,3)))^2;
        %第二类
        D2=(double(u(1,1)-z(2,1)))^2+(double(u(1,2)-z(2,2)))^2+(double(u(1,3)-z(2,3)))^2;
        %第三类
        D3=(double(u(1,1)-z(3,1)))^2+(double(u(1,2)-z(3,2)))^2+(double(u(1,3)-z(3,3)))^2;
        %第四类
        D4=(double(u(1,1)-z(4,1)))^2+(double(u(1,2)-z(4,2)))^2+(double(u(1,3)-z(4,3)))^2;
        %第五类
        DD1=(double(u(1,1)-z(5,1)))^2+(double(u(1,2)-z(5,2)))^2+(double(u(1,3)-z(5,3)))^2;
        %第六类
        DD2=(double(u(1,1)-z(6,1)))^2+(double(u(1,2)-z(6,2)))^2+(double(u(1,3)-z(6,3)))^2;
        %第七类
        DD3=(double(u(1,1)-z(7,1)))^2+(double(u(1,2)-z(7,2)))^2+(double(u(1,3)-z(7,3)))^2;
        %第八类
        DD4=(double(u(1,1)-z(8,1)))^2+(double(u(1,2)-z(8,2)))^2+(double(u(1,3)-z(8,3)))^2;
        

        
        %D1,D5最小
        if (D1<D2)&&(D1<D3)&&(D1<D4)&&(D1<DD1)&&(D1<DD2)&&(D1<DD3)&&(D1<DD4)
            %&&(D5<D6)&&(D5<D7)&&(D5<D8)&&(D5<DD5)&&(D5<DD6)&&(D5<DD7)&&(D5<DD8)%属于第一类
            resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
%             z1_after=z1+(RR(i,j);GG(i,j);BB(i,j));
            %更新z1类
%             z1_after=double(z1);
            z1_after(1,1)=double(z1_after(1,1)+u(1,1));
            z1_after(1,2)=double(z1_after(1,2)+u(1,2));
            z1_after(1,3)=double(z1_after(1,3)+u(1,3));
            
            m=m+1;
%             z1_after=double(z1_after/m);
         %D2,D6最小   
        elseif((D2<D1)&&(D2<D3))&&(D2<D4)&&(D2<DD1)&&(D2<DD1)&&(D2<DD2)&&(D2<DD3)&&(D2<DD4)
            %&&(D6<D5)&&(D6<D7)&&(D6<D8)&&(D6<DD5)&&(D6<DD7)&&(D6<DD8)&&(D6<DD6)%属于第二类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
             %更新z2类
%             z2_after=double(z2);
            z2_after(1,1)=double(z2_after(1,1)+u(1,1));
            z2_after(1,2)=double(z2_after(1,2)+u(1,2));
            z2_after(1,3)=double(z2_after(1,3)+u(1,3));
           
            n=n+1;
%             z2_after=double(z2_after/n);

      %D3,D7最小
        elseif(D3<D2)&&(D3<D1)&&(D3<D4)&&(D3<DD1)&&(D3<DD2)&&(D3<DD3)&&(D3<DD4)
            %&&(D7<D5)&&(D7<D6)&&(D7<D8)&&(D7<DD5)&&(D7<DD6)&&(D7<DD7)&&(D7<DD8)%属于第三类
            resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
             %更新z3类
%             z3_after=double(z3);
            z3_after(1,1)=double(z3_after(1,1)+u(1,1));
            z3_after(1,2)=double(z3_after(1,2)+u(1,2));
            z3_after(1,3)=double(z3_after(1,3)+u(1,3));
            
            l=l+1;
%             z3_after=double(z3_after/l);
        
        %D4,D8最小
        elseif(D4<D1)&&(D4<D2)&&(D4<D3)&&(D4<DD1)&&(D4<DD2)&&(D4<DD3)&&(D4<DD4)
            %&&(D8<D5)&&(D8<D6)&&(D8<D7)&&(D8<DD5)&&(D8<DD6)&&(D8<DD7)&&(D8<DD8)%属于第四类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第四类
            z4_after(1,1)=double(z4_after(1,1)+u(1,1));
            z4_after(1,2)=double(z4_after(1,2)+u(1,2));
            z4_after(1,3)=double(z4_after(1,3)+u(1,3));
           
            p=p+1;
           
          %DD1,DD5最小 %属于第五类  
        elseif(DD1<D1)&&(DD1<D2)&&(DD1<D3)&&(DD1<D4)&&(DD1<DD2)&&(DD1<DD3)&&(DD1<DD4)
            %&&(DD5<D5)&&(DD5<D6)&&(DD5<D7)&&(DD5<D8)&&(DD5<DD6)&&(DD5<DD7)&&(DD5<DD8)
             resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
            %更新第五类
            z5_after(1,1)=double(z5_after(1,1)+u(1,1));
            z5_after(1,2)=double(z5_after(1,2)+u(1,2));
            z5_after(1,3)=double(z5_after(1,3)+u(1,3));
            
            q=q+1;
          
            %DD2,DD6最小 %属于第六类  
        elseif(DD2<D1)&&(DD2<D2)&&(DD2<D3)&&(DD2<D4)&&(DD2<DD1)&&(DD2<DD3)&&(DD2<DD4)
            %&&(DD6<D5)&&(DD6<D6)&&(DD6<D7)&&(DD6<D8)&&(DD6<DD5)&&(DD6<DD7)&&(DD6<DD8)   
          resIm(i,j,1)=255;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
            %更新第六类
            z6_after(1,1)=double(z6_after(1,1)+u(1,1));
            z6_after(1,2)=double(z6_after(1,2)+u(1,2));
            z6_after(1,3)=double(z6_after(1,3)+u(1,3));
            
            mm=mm+1;
            
               %DD3,DD7最小 %属于第七类  
        elseif(DD3<D1)&&(DD3<D2)&&(DD3<D3)&&(DD3<D4)&&(DD3<DD1)&&(DD3<DD2)&&(DD3<DD4)
            %&&(DD7<D5)&&(DD7<D6)&&(DD7<D7)&&(DD7<D8)&&(DD7<DD5)&&(DD7<DD6)&&(DD7<DD8)   
          resIm(i,j,1)=255;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第七类
            z7_after(1,1)=double(z7_after(1,1)+u(1,1));
            z7_after(1,2)=double(z7_after(1,2)+u(1,2));
            z7_after(1,3)=double(z7_after(1,3)+u(1,3));
           
            nn=nn+1;
            
               %DD2,DD6最小 %属于八类  
        else
          resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
            %更新第八类
            z8_after(1,1)=double(z8_after(1,1)+u(1,1));
            z8_after(1,2)=double(z8_after(1,2)+u(1,2));
            z8_after(1,3)=double(z8_after(1,3)+u(1,3));
           
            pp=pp+1;
        end
        
       
        
    end
end
    z1_after=double(z1_after/m);
    z2_after=double(z2_after/n);
    z3_after=double(z3_after/l);
    z4_after=double(z4_after/p);
    z5_after=double(z5_after/q);
    z6_after=double(z6_after/mm);
    z7_after=double(z7_after/nn);
    z8_after=double(z8_after/pp);

 %计算新的聚类中心,并显示迭代一次后的图像

 %将新的到的聚类中心与上次的聚类中心相比较,如果相同,则循环结束
     if (z1_after(1,1)-z(1,1))^2+(z1_after(1,2)-z(1,2))^2+(z1_after(1,3)-z(1,3))^2<=0.01
        a=0;
     else
         a=1;
     end
     if (z2_after(1,1)-z(2,1))^2+(z2_after(1,2)-z(2,2))^2+(z2_after(1,3)-z(2,3))^2<=0.01
         b=0;
     else
         b=1;
     end
     if (z3_after(1,1)-z(3,1))^2+(z3_after(1,2)-z(3,2))^2+(z3_after(1,3)-z(3,3))^2<=0.01
         c=0;
     else
         c=1;
     end
     if (z4_after(1,1)-z(4,1))^2+(z4_after(1,2)-z(4,2))^2+(z4_after(1,3)-z(4,3))^2<=0.01
         d=0;
     else
         d=1;
     end
     if (z5_after(1,1)-z(5,1))^2+(z5_after(1,2)-z(5,2))^2+(z5_after(1,3)-z(5,3))^2<=0.01
         e=0;
     else
         e=1;
     end
      if (z6_after(1,1)-z(6,1))^2+(z6_after(1,2)-z(6,2))^2+(z6_after(1,3)-z(6,3))^2<=0.01
         f=0;
     else
         f=1;
      end
      if (z7_after(1,1)-z(7,1))^2+(z7_after(1,2)-z(7,2))^2+(z7_after(1,3)-z(7,3))^2<=0.01
         g=0;
     else
         g=1;
      end
      if (z8_after(1,1)-z(8,1))^2+(z8_after(1,2)-z(8,2))^2+(z8_after(1,3)-z(8,3))^2<=0.01
         h=0;
     else
         h=1;
     
         
     z(1,:)=z1_after;
     z(2,:)=z2_after;
     z(3,:)=z3_after;
     z(4,:)=z4_after;
     z(5,:)=z5_after;
     z(6,:)=z6_after;
     z(7,:)=z7_after;
     z(8,:)=z8_after;
     
 
      end
      imshow(resIm);
      if num_die<100
          num_die=num_die+1;
      else
          a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;
      end
end
      figure('Name','8类中心,特征(R,G,B)','NumberTitle','off');
      imshow(resIm);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    8类+xy
else
    k=8;
for i=1:8
     j=randi(1,1,(size(RGB,1)-1))+1;
     m=randi(1,1,(size(RGB,2)-1))+1;
     r =RR(j,m);%得到R G B分量,为行向量
     g =GG(j,m);
     b =BB(j,m);
     x(i,:)=[j m];
     z(i,:)=double([r g b]);
end

        
%%
%进行迭代计算


% z1_after=0;
% z2_after=0;
% z3_after=0;
a=1;
b=1;
c=1;
d=1;
e=1;
f=1;
g=1;
h=1;
num_die=0;

while (a||b||c||d||e||f||g||h)
    set(handles.edit3,'string',num2str(num_die));
    axes7=handles.axes7;
    axes(handles.axes7);
    %对m,n,l,z_after进行初始化
    m=1;
    n=1;
    l=1;
    p=1;
    q=1;
    mm=1;
    nn=1;
    pp=1;
    
    z1_after=double(z(1,:));
    z2_after=double(z(2,:));
    z3_after=double(z(3,:));
    z4_after=double(z(4,:));
    z5_after=double(z(5,:));
    z6_after=double(z(6,:));
    z7_after=double(z(7,:));
    z8_after=double(z(8,:));
    
    x1_after=double(x(1,:));
    x2_after=double(x(2,:));
    x3_after=double(x(3,:));
    x4_after=double(x(4,:));
    x5_after=double(x(5,:));
    x6_after=double(x(6,:));
    x7_after=double(x(7,:));
    x8_after=double(x(8,:));
    
for i=1:size(RGB,1)
    for j=1:size(RGB,2)
        u1=double(RR(i,j));
        u2=double(GG(i,j));
        u3=double(BB(i,j));
        u=double([u1 u2 u3]);


       %第一类
        D1=(double(u(1,1)-z(1,1)))^2+(double(u(1,2)-z(1,2)))^2+(double(u(1,3)-z(1,3)))^2+(x(1,1)-i)^2+(x(1,2)-j)^2;
        %第二类
        D2=(double(u(1,1)-z(2,1)))^2+(double(u(1,2)-z(2,2)))^2+(double(u(1,3)-z(2,3)))^2+(x(2,1)-i)^2+(x(2,2)-j)^2;
        %第三类
        D3=(double(u(1,1)-z(3,1)))^2+(double(u(1,2)-z(3,2)))^2+(double(u(1,3)-z(3,3)))^2+(x(3,1)-i)^2+(x(3,2)-j)^2;
        %第四类
        D4=(double(u(1,1)-z(4,1)))^2+(double(u(1,2)-z(4,2)))^2+(double(u(1,3)-z(4,3)))^2+(x(4,1)-i)^2+(x(4,2)-j)^2;
        %第五类
        DD1=(double(u(1,1)-z(5,1)))^2+(double(u(1,2)-z(5,2)))^2+(double(u(1,3)-z(5,3)))^2+(x(5,1)-i)^2+(x(5,2)-j)^2;
        %第六类
        DD2=(double(u(1,1)-z(6,1)))^2+(double(u(1,2)-z(6,2)))^2+(double(u(1,3)-z(6,3)))^2+(x(6,1)-i)^2+(x(6,2)-j)^2;
        %第七类
        DD3=(double(u(1,1)-z(7,1)))^2+(double(u(1,2)-z(7,2)))^2+(double(u(1,3)-z(7,3)))^2+(x(7,1)-i)^2+(x(7,2)-j)^2;
        %第八类
        DD4=(double(u(1,1)-z(8,1)))^2+(double(u(1,2)-z(8,2)))^2+(double(u(1,3)-z(8,3)))^2+(x(8,1)-i)^2+(x(8,2)-j)^2;
        

        
        %D1,D5最小
        if (D1<D2)&&(D1<D3)&&(D1<D4)&&(D1<DD1)&&(D1<DD2)&&(D1<DD3)&&(D1<DD4)
            %&&(D5<D6)&&(D5<D7)&&(D5<D8)&&(D5<DD5)&&(D5<DD6)&&(D5<DD7)&&(D5<DD8)%属于第一类
            resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
%             z1_after=z1+(RR(i,j);GG(i,j);BB(i,j));
            %更新z1类
%             z1_after=double(z1);
            z1_after(1,1)=double(z1_after(1,1)+u(1,1));
            z1_after(1,2)=double(z1_after(1,2)+u(1,2));
            z1_after(1,3)=double(z1_after(1,3)+u(1,3));
            x1_after(1,1)=double(x1_after(1,1)+i);
            x1_after(1,2)=double(x1_after(1,2)+j);
            m=m+1;
%             z1_after=double(z1_after/m);
         %D2,D6最小   
        elseif((D2<D1)&&(D2<D3))&&(D2<D4)&&(D2<DD1)&&(D2<DD1)&&(D2<DD2)&&(D2<DD3)&&(D2<DD4)
            %&&(D6<D5)&&(D6<D7)&&(D6<D8)&&(D6<DD5)&&(D6<DD7)&&(D6<DD8)&&(D6<DD6)%属于第二类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
             %更新z2类
%             z2_after=double(z2);
            z2_after(1,1)=double(z2_after(1,1)+u(1,1));
            z2_after(1,2)=double(z2_after(1,2)+u(1,2));
            z2_after(1,3)=double(z2_after(1,3)+u(1,3));
            x2_after(1,1)=double(x2_after(1,1)+i);
            x2_after(1,2)=double(x2_after(1,2)+j);
            n=n+1;
%             z2_after=double(z2_after/n);

      %D3,D7最小
        elseif(D3<D2)&&(D3<D1)&&(D3<D4)&&(D3<DD1)&&(D3<DD2)&&(D3<DD3)&&(D3<DD4)
            %&&(D7<D5)&&(D7<D6)&&(D7<D8)&&(D7<DD5)&&(D7<DD6)&&(D7<DD7)&&(D7<DD8)%属于第三类
            resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
             %更新z3类
%             z3_after=double(z3);
            z3_after(1,1)=double(z3_after(1,1)+u(1,1));
            z3_after(1,2)=double(z3_after(1,2)+u(1,2));
            z3_after(1,3)=double(z3_after(1,3)+u(1,3));
            x3_after(1,1)=double(x3_after(1,1)+i);
            x3_after(1,2)=double(x3_after(1,2)+j);
            l=l+1;
%             z3_after=double(z3_after/l);
        
        %D4,D8最小
        elseif(D4<D1)&&(D4<D2)&&(D4<D3)&&(D4<DD1)&&(D4<DD2)&&(D4<DD3)&&(D4<DD4)
            %&&(D8<D5)&&(D8<D6)&&(D8<D7)&&(D8<DD5)&&(D8<DD6)&&(D8<DD7)&&(D8<DD8)%属于第四类
            resIm(i,j,1)=0;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第四类
            z4_after(1,1)=double(z4_after(1,1)+u(1,1));
            z4_after(1,2)=double(z4_after(1,2)+u(1,2));
            z4_after(1,3)=double(z4_after(1,3)+u(1,3));
            x4_after(1,1)=double(x4_after(1,1)+i);
            x4_after(1,2)=double(x4_after(1,2)+j);
            p=p+1;
           
          %DD1,DD5最小 %属于第五类  
        elseif(DD1<D1)&&(DD1<D2)&&(DD1<D3)&&(DD1<D4)&&(DD1<DD2)&&(DD1<DD3)&&(DD1<DD4)
            %&&(DD5<D5)&&(DD5<D6)&&(DD5<D7)&&(DD5<D8)&&(DD5<DD6)&&(DD5<DD7)&&(DD5<DD8)
             resIm(i,j,1)=255;
            resIm(i,j,2)=0;
            resIm(i,j,3)=255;
            %更新第五类
            z5_after(1,1)=double(z5_after(1,1)+u(1,1));
            z5_after(1,2)=double(z5_after(1,2)+u(1,2));
            z5_after(1,3)=double(z5_after(1,3)+u(1,3));
            x5_after(1,1)=double(x5_after(1,1)+i);
            x5_after(1,2)=double(x5_after(1,2)+j);
            q=q+1;
          
            %DD2,DD6最小 %属于第六类  
        elseif(DD2<D1)&&(DD2<D2)&&(DD2<D3)&&(DD2<D4)&&(DD2<DD1)&&(DD2<DD3)&&(DD2<DD4)
            %&&(DD6<D5)&&(DD6<D6)&&(DD6<D7)&&(DD6<D8)&&(DD6<DD5)&&(DD6<DD7)&&(DD6<DD8)   
          resIm(i,j,1)=255;
            resIm(i,j,2)=255;
            resIm(i,j,3)=0;
            %更新第六类
            z6_after(1,1)=double(z6_after(1,1)+u(1,1));
            z6_after(1,2)=double(z6_after(1,2)+u(1,2));
            z6_after(1,3)=double(z6_after(1,3)+u(1,3));
            x6_after(1,1)=double(x6_after(1,1)+i);
            x6_after(1,2)=double(x6_after(1,2)+j);
            mm=mm+1;
            
               %DD3,DD7最小 %属于第七类  
        elseif(DD3<D1)&&(DD3<D2)&&(DD3<D3)&&(DD3<D4)&&(DD3<DD1)&&(DD3<DD2)&&(DD3<DD4)
            %&&(DD7<D5)&&(DD7<D6)&&(DD7<D7)&&(DD7<D8)&&(DD7<DD5)&&(DD7<DD6)&&(DD7<DD8)   
          resIm(i,j,1)=255;
            resIm(i,j,2)=255;
            resIm(i,j,3)=255;
            %更新第七类
            z7_after(1,1)=double(z7_after(1,1)+u(1,1));
            z7_after(1,2)=double(z7_after(1,2)+u(1,2));
            z7_after(1,3)=double(z7_after(1,3)+u(1,3));
            x7_after(1,1)=double(x7_after(1,1)+i);
            x7_after(1,2)=double(x7_after(1,2)+j);
            nn=nn+1;
            
               %DD2,DD6最小 %属于八类  
        else
          resIm(i,j,1)=0;
            resIm(i,j,2)=0;
            resIm(i,j,3)=0;
            %更新第八类
            z8_after(1,1)=double(z8_after(1,1)+u(1,1));
            z8_after(1,2)=double(z8_after(1,2)+u(1,2));
            z8_after(1,3)=double(z8_after(1,3)+u(1,3));
            x8_after(1,1)=double(x8_after(1,1)+i);
            x8_after(1,2)=double(x8_after(1,2)+j);
            pp=pp+1;
        end
        
       
        
    end
end
    z1_after=double(z1_after/m);
    z2_after=double(z2_after/n);
    z3_after=double(z3_after/l);
    z4_after=double(z4_after/p);
    z5_after=double(z5_after/q);
    z6_after=double(z6_after/mm);
    z7_after=double(z7_after/nn);
    z8_after=double(z8_after/pp);
    
    
    x1_after=double(x1_after/m);
    x2_after=double(x2_after/n);
    x3_after=double(x3_after/l);
    x4_after=double(x4_after/p);
    x5_after=double(x5_after/q);
    x6_after=double(x6_after/mm);
    x7_after=double(x7_after/nn);
    x8_after=double(x8_after/pp);
 
 %计算新的聚类中心,并显示迭代一次后的图像

 %将新的到的聚类中心与上次的聚类中心相比较,如果相同,则循环结束
     if (z1_after(1,1)-z(1,1))^2+(z1_after(1,2)-z(1,2))^2+(z1_after(1,3)-z(1,3)^2+(x1_after(1,1)-x(1,1))^2+(x1_after(1,2)-x(1,2))^2)<=0.01
        a=0;
     else
         a=1;
     end
     if (z2_after(1,1)-z(2,1))^2+(z2_after(1,2)-z(2,2))^2+(z2_after(1,3)-z(2,3))^2+(x2_after(1,1)-x(2,1))^2+(x2_after(1,2)-x(2,2))^2<=0.01
         b=0;
     else
         b=1;
     end
     if (z3_after(1,1)-z(3,1))^2+(z3_after(1,2)-z(3,2))^2+(z3_after(1,3)-z(3,3))^2+(x3_after(1,1)-x(3,1))^2+(x3_after(1,2)-x(3,2))^2<=0.01
         c=0;
     else
         c=1;
     end
     if (z4_after(1,1)-z(4,1))^2+(z4_after(1,2)-z(4,2))^2+(z4_after(1,3)-z(4,3))^2+(x4_after(1,1)-x(4,1))^2+(x4_after(1,2)-x(4,2))^2<=0.01
         d=0;
     else
         d=1;
     end
     if (z5_after(1,1)-z(5,1))^2+(z5_after(1,2)-z(5,2))^2+(z5_after(1,3)-z(5,3))^2+(x5_after(1,1)-x(5,1))^2+(x5_after(1,2)-x(5,2))^2<=0.01
         e=0;
     else
         e=1;
     end
      if (z6_after(1,1)-z(6,1))^2+(z6_after(1,2)-z(6,2))^2+(z6_after(1,3)-z(6,3))^2+(x6_after(1,1)-x(6,1))^2+(x6_after(1,2)-x(6,2))^2<=0.01
         f=0;
     else
         f=1;
      end
      if (z7_after(1,1)-z(7,1))^2+(z7_after(1,2)-z(7,2))^2+(z7_after(1,3)-z(7,3))^2+(x7_after(1,1)-x(7,1))^2+(x7_after(1,2)-x(7,2))^2<=0.01
         g=0;
     else
         g=1;
      end
      if (z8_after(1,1)-z(8,1))^2+(z8_after(1,2)-z(8,2))^2+(z8_after(1,3)-z(8,3))^2+(x8_after(1,1)-x(8,1))^2+(x8_after(1,2)-x(8,2))^2<=0.01
         h=0;
     else
         h=1;
     
         
     z(1,:)=z1_after;
     z(2,:)=z2_after;
     z(3,:)=z3_after;
     z(4,:)=z4_after;
     z(5,:)=z5_after;
     z(6,:)=z6_after;
     z(7,:)=z7_after;
     z(8,:)=z8_after;
     
     x(1,:)=x1_after;
     x(2,:)=x2_after;
     x(3,:)=x3_after;
     x(4,:)=x4_after;
     x(5,:)=x5_after;
     x(6,:)=x6_after;
     x(7,:)=x7_after;
     x(8,:)=x8_after;
      end
     imshow(resIm);
     if num_die<100
         num_die=num_die+1;
     else
         a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;
     end
     
end
figure('Name','8类中心,特征(R,G,B,X,Y)','NumberTitle','off');
imshow(resIm);
    
end
imwrite(resIm,'kmeans_deal.png');




function edit3_Callback(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit3 as text
%        str2double(get(hObject,'String')) returns contents of edit3 as a double


% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton1
global leibie;
leibie=1;
h1=findobj(gcf,'Tag','radiobutton1');
h2=findobj(gcf,'Tag','radiobutton2');
h3=findobj(gcf,'Tag','radiobutton3');
h4=findobj(gcf,'Tag','radiobutton4');
h5=findobj(gcf,'Tag','radiobutton5');
h6=findobj(gcf,'Tag','radiobutton6');
set(h1,'Value',1);
set(h2,'Value',0);
set(h3,'Value',0);
set(h4,'Value',0);
set(h5,'Value',0);
set(h6,'Value',0);


% --- Executes on button press in radiobutton2.
function radiobutton2_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton2
global leibie;
leibie=2;
h1=findobj(gcf,'Tag','radiobutton1');
h2=findobj(gcf,'Tag','radiobutton2');
h3=findobj(gcf,'Tag','radiobutton3');
h4=findobj(gcf,'Tag','radiobutton4');
h5=findobj(gcf,'Tag','radiobutton5');
h6=findobj(gcf,'Tag','radiobutton6');
set(h1,'Value',0);
set(h2,'Value',1);
set(h3,'Value',0);
set(h4,'Value',0);
set(h5,'Value',0);
set(h6,'Value',0);



% --- Executes on button press in radiobutton3.
function radiobutton3_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton3
global leibie;
leibie=3;
h1=findobj(gcf,'Tag','radiobutton1');
h2=findobj(gcf,'Tag','radiobutton2');
h3=findobj(gcf,'Tag','radiobutton3');
h4=findobj(gcf,'Tag','radiobutton4');
h5=findobj(gcf,'Tag','radiobutton5');
h6=findobj(gcf,'Tag','radiobutton6');
set(h1,'Value',0);
set(h2,'Value',0);
set(h3,'Value',1);
set(h4,'Value',0);
set(h5,'Value',0);
set(h6,'Value',0);

% --- Executes on button press in radiobutton4.
function radiobutton4_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton4
global leibie;
leibie=4;
h1=findobj(gcf,'Tag','radiobutton1');
h2=findobj(gcf,'Tag','radiobutton2');
h3=findobj(gcf,'Tag','radiobutton3');
h4=findobj(gcf,'Tag','radiobutton4');
h5=findobj(gcf,'Tag','radiobutton5');
h6=findobj(gcf,'Tag','radiobutton6');
set(h1,'Value',0);
set(h2,'Value',0);
set(h3,'Value',0);
set(h4,'Value',1);
set(h5,'Value',0);
set(h6,'Value',0);


% --- Executes on button press in radiobutton5.
function radiobutton5_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton5
global leibie;
leibie=5;
h1=findobj(gcf,'Tag','radiobutton1');
h2=findobj(gcf,'Tag','radiobutton2');
h3=findobj(gcf,'Tag','radiobutton3');
h4=findobj(gcf,'Tag','radiobutton4');
h5=findobj(gcf,'Tag','radiobutton5');
h6=findobj(gcf,'Tag','radiobutton6');
set(h1,'Value',0);
set(h2,'Value',0);
set(h3,'Value',0);
set(h4,'Value',0);
set(h5,'Value',1);
set(h6,'Value',0);


% --- Executes on button press in radiobutton6.
function radiobutton6_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton6
global leibie;
leibie=6;
h1=findobj(gcf,'Tag','radiobutton1');
h2=findobj(gcf,'Tag','radiobutton2');
h3=findobj(gcf,'Tag','radiobutton3');
h4=findobj(gcf,'Tag','radiobutton4');
h5=findobj(gcf,'Tag','radiobutton5');
h6=findobj(gcf,'Tag','radiobutton6');
set(h1,'Value',0);
set(h2,'Value',0);
set(h3,'Value',0);
set(h4,'Value',0);
set(h5,'Value',0);
set(h6,'Value',1);