GUI界面建立
成果:
在这里只介绍其中几个按钮的作用,不一一赘述,有问题可以私信,之后也会上传完整代码
(1)新建
(2)设计页面
先设计页面,再编写回调函数!
一般需要更改大小、文字,最重要的是要编辑tag值,以便找到回调函数
鼠标右键点击按钮,选择查看回调函数callback
在回调函数中编辑,点击后的反应
a、打开图片按钮
function open_Callback(hObject, eventdata, handles)
% hObject handle to open (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% axis off %%关闭坐标轴显示
global IMG0;
global IMG1;
global IMG2;
global IMG3;
global IMG4;
IMG0=0;
IMG1=0;
IMG2=0;
IMG3=0;
IMG4=0;
[filename pathname] =uigetfile({'*.*';'*.png';'*.JPEG';'.jpg';'*.bmp'},'打开图片');
if isequal(filename,0)||isequal(pathname,0)
msgbox('没有选中文件','出错');
return;
else
file=[pathname filename];
%%打开图像
RGB=imread(file);
%%打开axes1的句柄 进行axes1的操作
axes(handles.axes1);
axis tight;
%%在axes1中显示图像
imshow(RGB);
title('原始图像');
%% ****************************剪裁图像********************************
r=RGB(:,:,1);
% I=mat2gray(r);%实现图像矩阵的归一化,使矩阵的每个元素的值都在0和1之间
%I = rgb2gr11ay(RGB);%彩色图像转灰度图像
%% *******************图像分割(阈值法)*******************
%最大类间方差法自动计算灰度图像I阈值,再用im2bw得到二值图像
threshold = graythresh(r);
bw = im2bw(r,threshold);
% figure,imshow(bw)
%% ***************************形态学处理*********************
%删除二值图像bw中面积小于150的对象,默认情况下使用8邻域。
bw = bwareaopen(bw,30);
%闭合(先膨胀后腐蚀),填充物体内细小空洞,连接邻近物体,平滑边界
se = strel('disk',5);
bw = imclose(bw,se);
% 填充二值图像中的由边界包围的空洞区域。
bw = imfill(bw,'holes');
% figure,imshow(bw)
%% *******************************以上是图像二值化,下面找邻接矩阵*******************************
% 返回一个和bw大小相同的L矩阵,包含了标记了bw中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数),默认为8连通寻找
[L,n] = bwlabel(bw);
x=zeros(1,n);
for i=1:n
x(i)=sum(sum(L==i));
end
[m,ind]=max(x);
[y,x]=find(L==ind);
x0=min(x(:));%找连通域列中最小值
x1=max(x(:));
y0=min(y(:));
y1=max(y(:));
hold on
% rectangle('Position',[x0,y0,x1-x0,y1-y0],'edgeColor','g','LineWidth',1)%标出邻接矩阵
I = imcrop(RGB,[x0,y0,x1-x0,y1-y0]);
% figure,imshow(I3);
axes(handles.axes2);
imshow(I);
global name;
name='剪裁后的图像';
title(name);
global S;
S=I;%设置全局变量,保存初始图像路径,以便还原
global K;
K=1;
global N;
N={};
N{K}=name;
global B;
B={};
B{K}=I;
IMG0=I;
end
b、选择参数按钮
对于这个选择参数跳出方框的设计:
设计页面中双击按钮,可在检查器中设计显示中文"选择参数"
% --- Executes on button press in shanchu.
function shanchu_Callback(hObject, eventdata, handles)
% hObject handle to shanchu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global B;
global name
global N;
global K;
global IMG3;
global IMG4;
global IMG0;
if IMG0==0
msgbox('无图片');
elseif IMG3==0
msgbox('请执行上一步');
else
I=IMG3;
axes(handles.axes2);
prompt={'删除面积小于多少的对象?'};
defans={'100'};%设置默认值
p=inputdlg(prompt,'input',1,defans);
p1=str2num(p{1});
I1=bwareaopen(I,p1);
guidata(hObject,handles);
imshow(I1);
name='手动阈值法';
title(name);
K=K+1;
B{K}=getimage(handles.axes2);
N{K}=name;
IMG4=B{K};
end
c、多项选择按钮
在里面填上选项
在回调函数(huidu_Callback)里对var参数进行判断
% --- Executes on selection change in huidu.
function huidu_Callback(hObject, eventdata, handles)
% hObject handle to huidu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns huidu contents as cell array
% contents{get(hObject,'Value')} returns selected item from huidu
global B;
global name;
global N;
global K;
global IMG0;
global IMG1;
if IMG0==0
msgbox('无图片');
IMG1=0;
else
I=IMG0;
var=get(handles.huidu,'value');
axes(handles.axes2);
I=mat2gray(I);
switch var
case 1
I1=I(:,:,1);%图像增强
imshow(I1);
name='取R分量后的图像';
title(name);
case 2
I1=I(:,:,2);%图像增强
imshow(I1);
name='取G分量后的图像';
title(name);
case 3
I1=I(:,:,3);%图像增强
imshow(I1);
name='取B分量后的图像';
title(name);
case 4
I1=rgb2gray(I);%图像增强
imshow(I1);
name='取B分量后的图像';
title(name);
end
K=K+1;
B{K}=getimage(handles.axes2);
N{K}=name;
IMG1=B{K};
end
d、检测按钮
单击检测按钮会在后面的方框中出现检测结果:
利用set(handles.edit1,‘string’,a);函数设置,后面的方框名字是handles.edit1
% --- Executes on button press in jiance.
function jiance_Callback(hObject, eventdata, handles)
% hObject handle to jiance (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global IMG0
if IMG0==0
msgbox('无图片');
else
I = IMG0;
R=I(:,:,1);
I1=mat2gray(R);%实现图像矩阵的归一化,使矩阵的每个元素的值都在0和1之间
%% 图像增强—线性灰度变换
I1=imadjust(I1,stretchlim(I1),[]);%图像增强
%% 手动阈值法图像分割
k1=find(I1>180/255); %找到灰度值大于180的索引(指针)
I2=zeros(size(I1));
I2(k1)=255/255; %索引大于180的像素的灰度值置255
%% 删除面积小于100的对象
bw = bwareaopen(I2,100);
%% 边缘检测—canny算子
ed=edge(bw,'canny');
sum1=0;
[M,N]=size(ed);
for i=1:M
for j=1:N
if ed(i,j)==1
sum1=sum1+1;
end
end
end
n=sum1/(M*N);
%% ************计算最大连通域面积*********
[M,N]=size(bw);
[L,n] = bwlabel(bw);
x=zeros(1,n);
for k=1:n
x(k)=sum(sum(L==k));
end
[m,ind]=max(x);
con=0;
S=zeros(M,N);
for k=1:M
for j=1:N
if L(k,j)==ind
con=con+1;
S(k,j)=1;
end
end
end
CON=con/(M*N);
%% **********************************特征选择*****************************
h=imhist(R); %用红色分量图最好,灰度图次之,二值图再次之,边缘图方差很近
h=h./sum(h); %归一化
L=length(h); %计算灰度级
L=L-1;
h=h(:); %转化为列向量
rad=0:L;%生成随机数
rad=rad./L;%归一化
m=rad*h;%均值
rad=rad-m;
stm=zeros(1,3);
stm(1)=m;
for j=2:3
stm(j)=(rad.^j)*h;%计算n阶矩
end
usm(1)=stm(1)*L;%一阶矩
usm(2)=stm(2)*L^2;%二阶矩
%usm(3)=stm(3)*L^3;%三阶矩
st(1)=usm(1); %均值
st(2)=usm(2).^0.5; %标准差
%st(3)=1-1/(1+usm(2)); %平滑度
st(3)=sum(h.^2); %一致性
%st(5)=-sum(h.*log2(h+eps)); %熵
%% **********模型*******
svmModel_mat = load('flow_svmModel');
svmModel= svmModel_mat.svmModel;
%计算超平面方程参数
[~, r] = size(svmModel.SupportVectors);
w = sum(svmModel.SupportVectors .* repmat(svmModel.Alpha, 1, r));
b = svmModel.Bias;
%将需要验证的样本预处理, (缩放平移)
scale = svmModel.ScaleData.scaleFactor;
shift = svmModel.ScaleData.shift;
%获取样本
sData=[st(2),CON]; %本预测集只有这一个点,输出classes=-0.5918小于零,是线下类(B类蘑菇)
[c, ~] = size(sData);%获取样本数量, sData是样本 每一行是一个样本
sDataScaled = (sData+ repmat(shift, c, 1)) .* repmat(scale, c, 1);
%计算样本的类别
classes = sDataScaled * w' + b;
%算出来的classes小于0的是正类, 大于0的是负类
if classes>0
a='A';
else
a='B';
end
set(handles.edit1,'string',a);
end
(3)菜单栏设计
对于右上角的菜单栏设计
点击菜单编辑器进行编辑
将它连接到响应的回调函数或者另外写回调函数即可