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

📄 maingui.m

📁 利用模糊聚类的方法对图像分割
💻 M
📖 第 1 页 / 共 3 页
字号:
    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 + -