⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maingui.m

📁 利用模糊聚类的方法对图像分割
💻 M
📖 第 1 页 / 共 3 页
字号:
% handles    structure with handles and user data (see GUIDATA)



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

result = get(handles.btnrun,'UserData');

ButtonName=questdlg('保存结果为何种形式?', ...
                       '分割结果保存', ...
                       'JPG图片','MAT文件','MAT文件');
switch ButtonName,
     case 'MAT文件',
         [fname,path] = uiputfile('*.mat','保存为');
         if path==0  % 取消文件保存操作
             return;
         end
         save([path fname],'result','-v6');         
     case 'JPG图片',
         directoryname = uigetdir;
         if directoryname == 0 % canceled
             return;
         end
         pwdir = pwd; % 获得当前目录
         cd(directoryname); % 转到选定目录
         fnametmp = datestr(now,31);
         fnametmp = strrep(fnametmp,':','-');   % 文件名中不能够有:号
         fnametmp = strrep(fnametmp,' ','_');
         for k = 1:length(result)-1
             fnamestr = [fnametmp 'Kind',num2str(k),'.jpg'];
             fcell ={fnamestr};
             tmpM = result{k};
             imwrite(tmpM,fcell{1},'jpg');
         end
         fnamestr = [fnametmp,'Whole.jpg'];
         fcell ={fnamestr};
         tmpM = result{end};
         imwrite(tmpM,fcell{1},'jpg');
         cd(pwdir);
end % switch                   
 



% --- Executes on button press in btnquit.
function btnquit_Callback(hObject, eventdata, handles)
% hObject    handle to btnquit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% selection = questdlg(['退出 ' get(handles.MainFig,'Name') '?'],...
%                      ['退出 ...'],...
%                      '是','否','是');
% if strcmp(selection,'否')
%     return;
% end
htimer = timerfind('tag','showtime');
stop(htimer);
delete(htimer);
delete(handles.MainFig);



% --- Executes on selection change in hmenu.
function hmenu_Callback(hObject, eventdata, handles)
% hObject    handle to hmenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = get(hObject,'String') returns hmenu contents as cell array
%        contents{get(hObject,'Value')} returns selected item from hmenu

val = get(hObject,'Value');
set(hObject,'UserData',val);
if  val == 1
    set(handles.hbtxt,'Visible','off');
    set(handles.hedit_heb,'Visible','off');
elseif val == 2
    set(handles.hbtxt,'Visible','on');
    set(handles.hedit_heb,'Visible','on');
else
    msgbox('不可能出现的吧');
end


% --- Executes on button press in chkbx.
function chkbx_Callback(hObject, eventdata, handles)
% hObject    handle to chkbx (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 chkbx

val = get(hObject,'Value');
set(hObject,'UserData',val);
if val==0
    set(handles.hedit_info,'string',{' ';'不输出信息';' '});
else
    set(handles.hedit_info,'string',{' ';'尚未进行分割聚类';' '});
end


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

infostr = get(handles.hedit_info,'string');
[fname,path] = uiputfile('*.txt','导出为');
if path==0  % 取消文件保存操作
    return;
end
fid = fopen([path fname],'w');
if fid == -1    % 不能够打开文件
    msgbox({'不能打开文件' fname},'文件保存出错','error');
    return;
end

% 保存信息
fprintf(fid,'\r\n=====%s=====\r\n\r\n',datestr(now,31));
for k = 1:size(infostr,1)
    fprintf(fid,'%s',infostr(k,:));
    fprintf(fid,'\r\n');
end
fclose(fid);




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FCM 需要的子函数

% 子函数
function U = initfcm(cluster_n, data_n)
% 初始化fcm的隶属度函数矩阵
% 输入:
%   cluster_n   ---- 聚类中心个数
%   data_n      ---- 样本点数
% 输出:
%   U           ---- 初始化的隶属度矩阵
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);


% 子函数
function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
% 模糊C均值聚类时迭代的一步
% 输入:
%   data        ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
%   U           ---- 隶属度矩阵
%   cluster_n   ---- 标量,表示聚合中心数目,即类别数
%   expo        ---- 隶属度矩阵U的指数                      
% 输出:
%   U_new       ---- 迭代计算出的新的隶属度矩阵
%   center      ---- 迭代计算出的新的聚类中心
%   obj_fcn     ---- 目标函数值
mf = U.^expo;       % 隶属度矩阵进行指数运算结果
center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚类中心(5.4)式
dist = distfcm(center, data);       % 计算距离矩阵
obj_fcn = sum(sum((dist.^2).*mf));  % 计算目标函数值 (5.1)式
tmp = dist.^(-2/(expo-1));     
U_new = tmp./(ones(cluster_n, 1)*sum(tmp));  % 计算新的隶属度矩阵 (5.3)式


% 子函数
function out = distfcm(center, data)
% 计算样本点距离聚类中心的距离
% 输入:
%   center     ---- 聚类中心
%   data       ---- 样本点
% 输出:
%   out        ---- 距离
out = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1), % 对每一个聚类中心
    % 每一次循环求得所有样本点到一个聚类中心的距离
    out(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% KFCM 需要的子函数

% 子函数
function U = initkfcm(cluster_n, data_n)
% 初始化fcm的隶属度函数矩阵
% 输入:
%   cluster_n   ---- 聚类中心个数
%   data_n      ---- 样本点数
% 输出:
%   U           ---- 初始化的隶属度矩阵
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);


% 子函数
function [U_new,center_new,obj_fcn] = stepkfcm(data,U,center,expo,kernel_b)
% 模糊C均值聚类时迭代的一步
% 输入:
%   data        ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
%   U           ---- 隶属度矩阵
%   center      ---- 聚类中心
%   expo        ---- 隶属度矩阵U的指数         
%   kernel_b    ---- 高斯核函数的参数
% 输出:
%   U_new       ---- 迭代计算出的新的隶属度矩阵
%   center_new  ---- 迭代计算出的新的聚类中心
%   obj_fcn     ---- 目标函数值
feature_n = size(data,2);  % 特征维数
cluster_n = size(center,1); % 聚类个数
mf = U.^expo;       % 隶属度矩阵进行指数运算(c行n列)

% 计算新的聚类中心;根据(5.15)式
KernelMat = gaussKernel(center,data,kernel_b); % 计算高斯核矩阵(c行n列)
num = mf.*KernelMat * data;   % 式(5.15)的分子(c行p列,p为特征维数)
den = sum(mf.*KernelMat,2);   % 式子(5.15)的分子,(c行,1列,尚未扩展)
center_new = num./(den*ones(1,feature_n)); % 计算新的聚类中心(c行p列,c个中心)

% 计算新的隶属度矩阵;根据(5.14)式子
kdist = distkfcm(center_new, data, kernel_b);    % 计算距离矩阵
obj_fcn = sum(sum((kdist.^2).*mf));  % 计算目标函数值 (5.11)式
tmp = kdist.^(-1/(expo-1));     
U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); 


% 子函数
function out = distkfcm(center, data, kernel_b)
% 计算样本点距离聚类中心的距离
% 输入:
%   center     ---- 聚类中心
%   data       ---- 样本点
% 输出:
%   out        ---- 距离
cluster_n = size(center, 1);
data_n = size(data, 1);
out = zeros(cluster_n, data_n);
for i = 1:cluster_n % 对每个聚类中心 
    vi = center(i,:);
    out(i,:) = 2-2*gaussKernel(vi,data,kernel_b);
end


% 子函数
function out = gaussKernel(center,data,kernel_b)
% 高斯核函数计算
% 输入:
%   center      ---- 模糊聚类中心
%   data        ---- 样本数据点
%   kernel_b    ---- 高斯核参数
% 输出:
%   out         ---- 高斯核计算结果
if nargin == 2
    kernel_b = 150;
end
dist = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1), % 对每一个聚类中心
    % 每一次循环求得所有样本点到一个聚类中心的距离
    dist(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end
out = exp(-dist.^2/kernel_b^2);



 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -