📄 maingui.m
字号:
F = II;
set(hObject,'UserData',F);
set(handles.hedit_xuhao,'string',num2str(3));
% 默认显示第2幅图
I=F(1+181*181*(3-1):181*181*3);
I=reshape(I,181,181);
I=imrotate(I,90);
axes(handles.hyuansiaxes);
himage = imshow(I,[]);
set(gcf,'NextPlot','add'); % This is to cinquer the bug of imshow
% in image toolbox ver 5.0.0 and 5.0.1.
set(handles.hyuansiaxes,'UserData',I);
set(gcf,'Pointer','arrow');
set(handles.hslider,'enable','off'); % 滑动条不可用
set(handles.btnsave,'enable','off'); % 结果保存按钮不可用
else
set(handles.hedit_fname,'string','尚未打开');
end
function hedit_heb_Callback(hObject, eventdata, handles)
% hObject handle to hedit_heb (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 hedit_heb as text
% str2double(get(hObject,'String')) returns contents of hedit_heb as a double
str = get(hObject,'string');
data = str2num(str);
if isempty(data) % 输入参数有效性检测
errordlg('输入必须为数值!','参数错误');
set(hObject,'BackgroundColor','r');
else
set(hObject,'BackgroundColor','w');
set(hObject,'UserData',data);
end
function hedit_xuhao_Callback(hObject, eventdata, handles)
% hObject handle to hedit_xuhao (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 hedit_xuhao as text
% str2double(get(hObject,'String')) returns contents of hedit_xuhao as a double
str = get(hObject,'string');
data = str2num(str);
if isempty(data) % 输入参数有效性检测
errordlg('输入必须为数值!','参数错误');
set(hObject,'BackgroundColor','r');
elseif data<1 || data>7 || data~=round(data) % 如果序号超出范围,或不是整数
errordlg('输入必须为介于1到7之间的整数!','参数错误');
set(hObject,'BackgroundColor','r');
else
set(hObject,'BackgroundColor','w');
% 根据输入序号显示原图
F = get(handles.btnOpen,'UserData');
if isempty(F)
msgbox('尚未打开图像数据文件','操作错误');
return;
else
I=F(1+181*181*(data-1):181*181*data);
I=reshape(I,181,181);
I=imrotate(I,90);
axes(handles.hyuansiaxes);
himage = imshow(I,[]);
set(gcf,'NextPlot','add'); % This is to cinquer the bug of imshow
% in image toolbox ver 5.0.0 and 5.0.1.
set(handles.hyuansiaxes,'UserData',I);
set(handles.hedit_xuhao,'UserData',data);
end
end
function hedit_zhishu_Callback(hObject, eventdata, handles)
% hObject handle to hedit_zhishu (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 hedit_zhishu as text
% str2double(get(hObject,'String')) returns contents of hedit_zhishu as a double
str = get(hObject,'string');
data = str2num(str);
if isempty(data) % 输入参数有效性检测
errordlg('输入必须为数值!','参数错误');
set(hObject,'BackgroundColor','r');
elseif data<=1 % 如果指数不大于1
errordlg('输入必须大于1','参数错误');
set(hObject,'BackgroundColor','r');
else
set(hObject,'BackgroundColor','w');
set(hObject,'UserData',data);
end
function hedit_zuixiao_Callback(hObject, eventdata, handles)
% hObject handle to hedit_zuixiao (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 hedit_zuixiao as text
% str2double(get(hObject,'String')) returns contents of hedit_zuixiao as a double
str = get(hObject,'string');
data = str2num(str);
if isempty(data) % 输入参数有效性检测
errordlg('输入必须为数值!','参数错误');
set(hObject,'BackgroundColor','r');
elseif data<0 % 如果指数不大于1
errordlg('输入必须大于0','参数错误');
set(hObject,'BackgroundColor','r');
else
set(hObject,'BackgroundColor','w');
set(hObject,'UserData',data);
end
function hedit_cishu_Callback(hObject, eventdata, handles)
% hObject handle to hedit_cishu (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 hedit_cishu as text
% str2double(get(hObject,'String')) returns contents of hedit_cishu as a double
str = get(hObject,'string');
data = str2num(str);
if isempty(data) % 输入参数有效性检测
errordlg('输入必须为数值!','参数错误');
set(hObject,'BackgroundColor','r');
elseif data<1 || data~=round(data) % 如果序号超出范围,或不是整数
errordlg('输入必须为大于等于1的整数!','参数错误');
set(hObject,'BackgroundColor','r');
else
set(hObject,'BackgroundColor','w');
set(hObject,'UserData',data);
end
function hedit_leibie_Callback(hObject, eventdata, handles)
% hObject handle to hedit_leibie (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 hedit_leibie as text
% str2double(get(hObject,'String')) returns contents of hedit_leibie as a double
str = get(hObject,'string');
data = str2num(str);
if isempty(data) % 输入参数有效性检测
errordlg('输入必须为数值!','参数错误');
set(hObject,'BackgroundColor','r');
elseif data<2 || data~=round(data) % 如果序号超出范围,或不是整数
errordlg('输入必须为大于等于2的整数!','参数错误');
set(hObject,'BackgroundColor','r');
else
set(hObject,'BackgroundColor','w');
set(hObject,'UserData',data);
end
% --- Executes on button press in btnrun.
function btnrun_Callback(hObject, eventdata, handles)
% hObject handle to btnrun (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% 更改界面控件状态
set(handles.hedit_info,'enable','on'); % 信息输出编辑框可用
set(handles.btnsave,'enable','on'); % 结果保存按钮可用
expo = get(handles.hedit_zhishu,'UserData'); % 指数m
max_iter = get(handles.hedit_cishu,'UserData'); % 最大迭代次数
min_impro = get(handles.hedit_zuixiao,'UserData'); % 目标函数最小改变量
cluster_n = get(handles.hedit_leibie,'UserData'); % 聚类数目
display = get(handles.chkbx,'UserData'); % 每次迭代是否输出信息
algorithm = get(handles.hmenu,'UserData'); % 选择的算法种类
data = get(handles.hyuansiaxes,'UserData'); % 获取原始图像数据
data = data(:);
data_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数
in_n = size(data, 2); % 求出data的第二维(columns)数,即特征值长度
obj_fcn = zeros(max_iter, 1); % 初始化输出参数obj_fcn
infostr = '';
if algorithm==1 % FCM图像分割
U = initfcm(cluster_n, data_n); % 初始化模糊分配矩阵,使U满足列上相加为1,
% Main loop 主要循环
for i = 1:max_iter,
%在第k步循环中改变聚类中心ceneter,和分配函数U的隶属度值;
[U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
if display,
infostr =sprintf([infostr 'FCM:Interate count = %d \n\t obj.fcn = %f\n'],i,obj_fcn(i));
set(handles.hedit_info,'String',infostr);
drawnow;
end
% 终止条件判别
if i > 1,
if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro,
break;
end,
end
end
iter_n = i; % 实际迭代次数
obj_fcn(iter_n+1:max_iter) = [];
if display,
infostr =sprintf([infostr 'FCM:Actual iterations= %d \n\t obj.fcn = %f\n'],iter_n,obj_fcn(i));
set(handles.hedit_info,'String',infostr);
drawnow;
end
else % KFCM图像分割
kernel_b = get(handles.hedit_heb,'UserData'); % 获取高斯核参数
U = initkfcm(cluster_n, data_n); % 初始化模糊分配矩阵,使U满足列上相加为1
% 初始化聚类中心:从样本数据点中任意选取cluster_n个样本作为聚类中心。当然,
% 如果采用某些先验知识选取中心或许能够达到加快稳定的效果,但目前不具备这功能
index = randperm(data_n); % 对样本序数随机排列
center_old = data(index(1:cluster_n),:); % 选取随机排列的序数的前cluster_n个
% Main loop 主要循环
for i = 1:max_iter,
%在第k步循环中改变聚类中心ceneter,和分配函数U的隶属度值;
[U, center, obj_fcn(i)] = stepkfcm(data,U,center_old, expo, kernel_b);
if display,
infostr =sprintf([infostr 'KFCM:Interate count = %d \n\t obj.fcn = %f\n'],i,obj_fcn(i));
set(handles.hedit_info,'String',infostr);
drawnow;
end
center_old = center; % 用新的聚类中心代替老的聚类中心
% 终止条件判别
if i > 1,
if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro, break; end,
end
end
iter_n = i; % 实际迭代次数
obj_fcn(iter_n+1:max_iter) = [];
if display,
infostr =sprintf([infostr 'KFCM:Actual iterations= %d \n\t obj.fcn = %f\n'],iter_n,obj_fcn(i));
set(handles.hedit_info,'String',infostr);
drawnow;
end
end
% 分割结果显示
maxU = max(U);
data = data';
wholeD = zeros(size(data));
for k = 1:cluster_n
indexk = (U(k,:) == maxU);
Ik = indexk.*data;
Ik = reshape(Ik,181,181);
result{k} = Ik;
wholeG(indexk) = k-1;
end
wholeG = reshape(wholeG,181,181);
result{end+1} = wholeG;
set(handles.btnrun,'UserData',result);
% 显示分割后整体图
axes(handles.hzhengtiaxes);
imshow(wholeG,[]);
set(gcf,'NextPlot','add');
% 显示第一类
axes(handles.h1leiaxes);
imshow(result{1},[]);
set(gcf,'NextPlot','add');
% 显示第二类
axes(handles.h2leiaxes);
imshow(result{2},[]);
set(gcf,'NextPlot','add');
set(handles.hslider,'enable','on'); % 滑动条可用
% --- Executes on button press in btnhelp.
function btnhelp_Callback(hObject, eventdata, handles)
% hObject handle to btnhelp (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -