Matlab大作业-基于GUI制作图像处理工具箱

11.9

大作业进度开始的有点晚,记一下学习心得。

首先学习一下GUI界面的制作。看了一下老师给的别人的源码,功能很多也很好,但是和我们自己的作业要求有点差别,而且也不能copy。我用的2020版matlab,直接在软件找已经找不到GUI,好像以后都要变成app了,但是这次大作业我们还是得做GUI,哈哈。

找了一下GUI基础教程。(补充一下心得:建议先了解一下handles再做回调会简单很多)

Matlab实践之图形化界面设计与使用

从文件夹加载图片的GUI教程,创建按钮和坐标区。

GUI加载图片

新建一个GUI,保存为fig格式。实验要求显示的图片感觉好多,都不知道怎么排版比较好。建议多使用对齐工具和按钮组,让界面看起来更舒服。了解了一下基础的回弹事件,感觉GUI也挺简单的,放到对应函数里面去就好了。

基础控件的使用和回调

【新手向】手把手带你入门的MATLAB的GUI编程实例

Matlab大作业-基于GUI制作图像处理工具箱_第1张图片

打算先做一下GUI界面然后再慢慢调用函数。

下午做了一个简单的基础界面。

Matlab大作业-基于GUI制作图像处理工具箱_第2张图片

11.11

今天做maya大作业和复习线代去了,晚上做一下matlab。

改了一下每个组件的Tag,然后在导入图片的callback回调事件中加入代码。

Matlab大作业-基于GUI制作图像处理工具箱_第3张图片

% '*.*'为显示当前文件夹中的所有文件;
% select a picture为文件对话框的标题;
% 'multiselect','on'为打开选择多个模式(默认为关);
axes(handles.origin)
[fn, pn, ~] = uigetfile('*.*','请选择所要识别的图片','multiselect','on');
I = imread([pn fn]);%读取图像参数为图像名称和图像路径
imshow(I);

参考了一下别人的代码,觉得应该在界面初始化的时候设置所有按钮无法点击,不然有功能没有图片会出现问题,先加载图片才能使用功能。

%设置按钮不可点击
set(handles.grey,'Enable','off');
set(handles.binary,'Enable','off');
set(handles.getapple,'Enable','off');
set(handles.getcoin,'Enable','off');
set(handles.balance,'Enable','off');
set(handles.picadd,'Enable','off');
set(handles.picsub,'Enable','off');
set(handles.light,'Enable','off');
……

%写一个函数方便调用
function on(handles)
set(handles.grey,'Enable','on');
set(handles.binary,'Enable','on');
set(handles.getapple,'Enable','on');
set(handles.getcoin,'Enable','on');
set(handles.balance,'Enable','on');
set(handles.picadd,'Enable','on');
set(handles.picsub,'Enable','on');
set(handles.light,'Enable','on');
……
%调用方法
on(handles)%激活按钮

Matlab大作业-基于GUI制作图像处理工具箱_第4张图片

11.12

周末早起做作业了,加载摄像头,用的这个教程。

MATLAB调用USB摄像头实现过程

报错:错误使用 webcam (line 116) 已存在与网络摄像机 EasyCamera 的有效连接。不能创建与同一网络摄像机的另一连接。

解决方法:

clear	% 清除变量
clc		% 清除界面信息

 在Gui界面中显示视频流尽量使用Image Acquisition Toolbox。但是我装不了,所以还是使用的其他方法,看起来还是很成功的。

webcamlist;
cam1 = webcam(1);
img = snapshot(cam1); %抓拍图片
axes(handles.origin) %展示到第一个坐标
imshow(img);

handles.img=img;%存入句柄
handles.img2=img;

axes(handles.result) %展示到第二个坐标
imshow(handles.img2);

clear cam1 %关闭摄像头
on(handles)%激活按钮
guidata(hObject, handles);

Matlab大作业-基于GUI制作图像处理工具箱_第5张图片

图片灰度化,我刚开始不是很懂,把img变成全局变量,然后在后面进行调用。在灰度化的时候要使用有颜色的rgb图片才行,不能用已经灰度化的图片,再加载直方图。

在进行直方图的加载的时候我又遇到了第一次做实验遇到的错误,像这样,要把figure写在前面,把imhist函数写在最后,否则加载的直方图就是一条直线。

%普通加载
figure(6); subplot(1,2,1);
imhist(g,64);

%在gui中加载直方图
axes(handles.axes4)
imhist(handles.img2,64);  %转换直方图

坐标轴稍微有一点重叠,但是应该不影响观看,就这样吧。 亮度变化也做好了。

Matlab大作业-基于GUI制作图像处理工具箱_第6张图片

后面发现自己用global全局变量传递数据的办法有点笨,改成了用句柄,哎,真的很折腾。

guidata handles理解

放几个常用的交互传递GUI参数的代码

%获取滑动条选择的参数
th = get(handles.binary,'Value')%0~1之间的一个数值
%滑动条最大值为1.0,最小值为0.0是因为im2bw函数的阈值输入在0~1之间
%二值化时自定义拖动选择的阈值
%把滑动条的数字传递到GUI界面的文本框中
set(handles.text11,'String',num2str(th));

%获取可编辑文本框edit中的参数,记得类型是string,需要转成num数值类型才能使用
handles.angle=str2num(get(handles.edit3,'String'));%获得输入值

Matlab大作业-基于GUI制作图像处理工具箱_第7张图片

二值化,图像叠加和亮度变化也做完了。在做的时候不断调整gui,使其更加合理。

运动模糊和对数,指数变换已实现。(这些都是平时作业有的代码就不放出来了)今天做了差不多六个小时,有点累。

Matlab大作业-基于GUI制作图像处理工具箱_第8张图片

11.13,继续 

val=get(hObject,'Value');%获得选取项
%不同选项事件
switch val
        case 1
            %对话框
            helpdlg('请选择需要添加的噪声','Morphological Operations');
        case 2
            handles.img3=imnoise(handles.img3,'gaussian',0.02);
            axes(handles.uppic); %在右边进阶图像中展示
            imshow(handles.img3);
        case 3
            handles.img3=imnoise(handles.img3,'salt & pepper',0.02);
            axes(handles.uppic); %在右边进阶图像中展示
            imshow(handles.img3);
end
guidata(hObject, handles);

Matlab大作业-基于GUI制作图像处理工具箱_第9张图片

像这种必须要有3x3或者5x5模板才能进行滤波器操作,有前提条件的情况,那么选择的radiobutton最好添加一个默认值,也就是有默认勾选,在CreateFcn回调里面添加。

Matlab大作业-基于GUI制作图像处理工具箱_第10张图片

function x3_CreateFcn(hObject, eventdata, handles)
%初始值
handles.mould=3;
guidata(hObject, handles);%保存句柄

高斯滤波在实验3的时候没有做,花了一点时间找代码和学习。 handles真好用,什么类型的值都可以存ovo

function filter_Callback(hObject, eventdata, handles)
val=get(hObject,'Value');%获得选取项
%不同选项事件
switch val
        case 1
            %对话框
            helpdlg('请选择需要使用的滤波器','Morphological Operations');
        case 2
            %均值滤波模板
            handles.num=1;
            handles.mb=fspecial('average',handles.mould);
        case 3
            handles.num=2;
        case 4
            %高斯滤波模板
            handles.num=3;
            handles.mb=fspecial('gaussian',[handles.mould,handles.mould],1);
end
guidata(hObject, handles);

function ok1_Callback(hObject, eventdata, handles)
if handles.num==1
    %均值滤波器,255归一化
    handles.img3= filter2(handles.mb,handles.img3)/255; 
    axes(handles.uppic); %在右边进阶图像中展示
    imshow(handles.img3);
end
if handles.num==2
    %中值滤波
    handles.img3= medfilt2(handles.img3,[handles.mould handles.mould]); 
    axes(handles.uppic); %在右边进阶图像中展示
    imshow(handles.img3);
end
if handles.num==3
	handles.img3=filter2(handles.mb,handles.img3)/255;%用生成的高斯序列进行滤波
    axes(handles.uppic); %在右边进阶图像中展示
    imshow(handles.img3);
end
guidata(hObject, handles);

大多数功能都做完了,还剩硬币检测和提取红苹果

Matlab大作业-基于GUI制作图像处理工具箱_第11张图片

11.18

前几天在准备线代考试,没有进度,今天继续。

判断图像是否已经灰度化的方法。

[m,n,l] = size(handles.img3);%检测图片的规格
if l == 3
    handles.img3 = rgb2gray(handles.img3);    %如果为彩色图 则转化为灰度图
else
    handles.img3=handles.img3;
end

红苹果检测老师给的代码又要装一个什么工具箱,好麻烦,我看看有没有其他办法可以做,先做了硬币检测。

基于Matlab实现硬币识别

你可能感兴趣的:(matlab实验,matlab,开发语言)