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);