Matlab毕业设计论文
然后,选择一个空模板(Blang
GUI),点击确定,打开指南设计界面,如下图:
单击工具栏上的菜单编辑器(菜单)
编辑器),打开菜单编辑器,如下:
在菜单中
在工具栏中创建一个名为“文件”的新菜单项。其他设置见下图:
在文件菜单下添加菜单项:打开、保存、退出。见下图:
如果需要在菜单项“退出”上添加分隔线,选择“分隔符”
以上这一项”就行了。
将我的界面另存为pjimage.fig
保存后会自动打开pjimage.m文件,我们所有的程序都会写在这个m文件中。在编程中,鼠标的每个动作都对应一个回调函数。我们的菜单也是。
在界面上,单击鼠标右键,选择“属性”
检查器”,您可以打开属性窗口。当我们点击不同的控件时,它们对应的属性会显示在这里,我们可以修改它们。最重要的属性是标签属性和字符串属性。
设置当前图形窗口的Tag属性为:figure_pjimage,窗口的title (Name属性)为:Image Processing Instance。如下所示:
然后,单击工具栏中的保存按钮。之后,单击工具栏中的运行按钮(运行
图)。请注意,工具栏中的图标会被提示,例如“运行”按钮。
我们将看到以下界面:
这意味着我们的目录被保存了。fig文件不是当前目录,但没关系,我们只需点击“更改”即可
目录"来改变当前目录。当然,如果你想把当前目录添加到MATLAB路径中,点击“添加到”
路径”就可以了。我建议在这里点击“更改”。
目录”,因为没有很大的必要添加到MATLAB路径中。一般需要添加工具箱或者我们的函数或程序完成,在MATLAB的命令窗口中找不到我们的函数时,可以将函数或程序所在的目录添加到MATLAB路径中。
反正点那个按钮就看个人爱好了。无论点击两个按钮中的哪一个,程序都会正确运行。
当我们的程序运行时,它看起来像这样:
我们可以看到文件下的菜单项和快捷键,但是我们没有写程序,所以即使点了也没有反应。而如果不想设置快捷键,可以在菜单中设置。
在编辑器中设置,选择为Ctrl+none即可,如下:
在这种情况下,没有保存项目的快捷键。我们可以通过上面的按钮“查看”来查看这个菜单项的响应功能,也就是回调功能。也可以在pjimage.m中看到比如保存的Tag属性是m_file_save,那么它对应的回调函数的名字就是m_file_save_Callback。诸如此类。
让我们写一个函数来打开一个菜单项。要打开一张图片,当然需要打开一个对话框。在界面编程中,打开对话框的功能是uigetfile。
可以使用help uigetfile命令查看它的详细描述。以下是打开菜单的响应函数:
功能
m_file_open_Callback(hObject,eventdata,handles)
[文件名,路径名] =
uigetfile(...
{'*.bmp*.jpg*.png*.jpeg ','图像文件(*。bmp,
*.jpg,*。png,*。JPEG)’;...
'*.* '所有文件
(*.*)'}, ...
挑一个
图片’);
保存。m文件并运行程序。点击“文件”下的“打开”,打开如下打开对话框:
选择文件后,程序中的文件名就是你选择的文件的文件名,pathname就是文件所在目录的路径。例如:文件名
=5.jpg,路径名= C:\文档和设置\管理员\我的
文档\ .
那么在获取路径后,如何读取并显示一张图片呢?读入图片可以使用imread函数,显示可以在坐标轴上。然后我们需要在界面上画一个坐标轴。为了比较,我们画了两个坐标轴,一个在加工之前,一个在加工之后。并且加工前轴的Tag属性改为axes_src,加工后轴的Tag属性为axes_dst。进行更改后,保存。如下所示:
然后在原来的m_file_open_Callback程序的基础上,增加下面的程序:
axes(handles . axes _ src);%使用axes命令将当前操作的轴设置为axes_src。
fpath =[路径名
文件名];%将文件名和目录名组合成一个完整的路径。
im show(im read(fpath));%用imread读入图片,用imshow显示在axes_src上。
运行程序,通过“打开”菜单项打开一张图片。效果如下:
那么如何保存一张图片呢?使用imwrite命令。但是imwrite命令的第一个参数是你读入的图片数据,也就是imread的返回值。在这种情况下,我们需要对m_file_open_Callback中的程序做一点改动。把最后一句话(imshow(imread(fpath))改成两句话如下:img _ src = imread(fpath);imshow(img _ src);
而且,如何在保存菜单的回调函数下获取img_src变量呢?在这里,img_src将被用作* * *共享数据。很多接口编程的朋友喜欢用全局来声明。我个人不喜欢,因为有更好的办法。那就是使用setappdata和getappdata函数。我们可以在界面上为任何具有Tag属性的空间添加应用程序数据。当然我更喜欢把这些* * *应用数据加到图形窗口,因为这样好记,但是如果有一个控件就不太好记了。
在。m文件,你会发现除了每个菜单项的回调函数之外,还有两个函数:pjimage_OpeningFcn和pjimage_OutputFcn,相当于接口的初始化函数,而pjimage_OpeningFcn是接口的输出函数,也就是调用。m文件而不是运行fig。
因此,我们需要在pjimage _ OpeningFcn中添加以下程序,以* * *享受这个img_src矩阵。代码如下:
setappdata(handles . figure _ pj image,' img_src ',0);
然后,在m_file_open_Callback函数的末尾编写以下程序:
setappdata(handles . figure _ pj image,' img_src ',img _ src);
然后,我们可以像这样在m_file_save_Callback函数中提取img_src,如下:
img _ src = getappdata(handles . figure _ pj image,' img _ src ');
那么保存的时候,自然会用到保存对话框。要使用保存对话框,您需要使用uiputfile函数。有关详细信息,请使用帮助。
Uiputfile视图。
然后,将程序保存在菜单项(m_file_save_Callback)下,如下所示:
[文件名,
路径名] = uiputfile({'*。bmp ',' BMP文件';'*.jpg',' JPG文件' },'选择一个
图片’);
if isequal(文件名,0) || isequal(路径名,0)
返回;%如果您单击“取消”
其他
fpath =完整文件(路径名,
文件名);另一种获得完整路径%的方法。
结束
img _ src = getappdata(handles . figure _ pj image,' img _ src ');%获取打开图片的数据。
imwrite(img_src,fpath);%保存图片
下面是退出菜单项的程序。退出界面,用关闭功能就可以了,但是一般都会有提示。比如你已经对图片进行了处理而没有保存,那么在关闭的时候要给出提示,询问是否保存。不过,这里先不做这个工作,以后需要的时候再写。因此,此处退出菜单项的过程只有一句话,如下所示:
close(handles . figure _ pj image);
其实也可以使用删除函数,即:delete(handles . figure _ pj image);看你心情了。
但是当你运行程序的时候,你会发现如果你在打开图片的时候点击“取消”按钮,MATLAB的命令窗口会弹出一个错误,因为我们没有处理取消。下面我们来处理这个问题,只要把m_file_open_Callback下面的程序改成下面的程序:
[文件名,
路径名] = uigetfile(...
{'*.bmp*.jpg*.png*.jpeg ','图像文件
(*.bmp,*。jpg,*。png,*。JPEG)’;...
'*.* '所有文件
(*.*)'}, ...
挑选一个图像’);
if isequal(filename,0) ||
isequal(路径名,0),
返回;
结束
axes(handles . axes _ src);
fpath =[路径名
文件名];
img _ src = im read(fpath);
imshow(img _ src);
setappdata(handles . figure _ pj image,' img_src ',img _ src);
我们来做一个图像二值化的图像处理。如上添加一个“图像处理”菜单,如下所示:
在其下方添加“图像二值化”菜单项,如下:
然后,单击确定关闭菜单编辑器并保存整个界面。如果我们的。m文件,我们可以点击上图中的“查看”按钮生成一个回调函数。图像二值化是有阈值的,所以我们可以创建一个新的界面,在这个界面上放一个滑块来设置图像二值化的阈值。同时,有一个文本显示当前滑块的值。然后让我们创建一个新的空白界面,并在上面画一个静态。
文本和滑块控件,然后使用工具栏对齐工具(对齐
对象),到两个空格。如下所示:
然后,将这个接口保存为im2bw_args.fig整个设计如下:
您可以设置静态。
Text的FontSize属性是10,所以字体会比较大。设置静态
文本的Tag属性为txt_display,滚动条的Tag属性设置为slider_val。为了能够在滚动条上滚动,静态
文本显示滚动条的值。你需要在滚动条的回调中编写下面的程序。您可以右键单击滚动条并选择“查看”
“回调”下的“回调”直接进入滚动条的回调函数(slider_val_Callback)。
val=get(hObject,' Value ');
set(handles.txt_display,' String ',num2 str(val));
保存,运行程序,可以滑动滚动条,静态
文本将显示相应的值。双击figure打开figure的属性窗口(底部带方框的窗口),将其Tag属性设置为“figure_im2bw”,将其Name属性设置为“设置图像二值化阈值”。然后,保存界面。在运行时,如下所示:
然后,我们想到的是,当滑块滑动时,pjimage中的axes_dst坐标轴上会显示二值图像. fig那么我们该怎么办呢?首先,当你在PJI图像中点击“图像处理”下的“图像二值化”时。FIG菜单,im2bw_args.fig将被打开。这就是我们调用im2bw_args.m的时候了,调用的时候我们会返回一个句柄,这个句柄指向打开的im2bw_args.fig,更多细节可以参考im2bw_args.m文件前面的注释,内容是:
%
H = IM2BW_ARGS返回句柄到一个新的IM2BW_ARGS或句柄到
% the
现存的
单例*。
也就是说我们可以如上图打开im2bw_args.fig。所以在“图像二值化”(m_image_2bw_Callback)的回调函数下,写下面的程序:
h = im2bw _ args
然后,保存pjimage.fig还有,最好将im2bw_args.fig和pjimage.fig保存在一个目录下。然后运行pjimage.fig,可以看到点击“图像二值化”会打开im2bw_args.fig,滑块滑动时也会显示响应值。
先说滑块滑动时如何显示滑动二值图像到pjimage的axes_dst坐标轴。
首先我们需要获取pjimage的figure的句柄,可以通过findobj函数来完成,然后用guihandles把返回值转换成一个句柄。之后就可以用这个转换后的句柄来引用pjimage.fig中的任何控件了因此,我们在im2bw_args.fig下的slider的回调函数中添加了以下函数:
h _ pj image = getappdata(handles . figure _ im2bw,' h _ pj image ');
axes(h _ pj image . axes _ dst);
img _ src = getappdata(h _ pj image . figure _ pj image,' img _ src ');
bw=im2bw(img_src,val);
im show(bw);
然后,在im2bw_args_OpeningFcn中添加以下内容:
h_pjimage=findobj('Tag ',' figure _ pj image ');
h _ pj image = GUI handles(h _ pj image);
setappdata(handles . figure _ im2bw,' h_pjimage ',h _ pj image);
然后,保存并运行。效果如下:
但是,如果我们在不打开图片的情况下点击“图像二值化”,会发生什么情况呢?你可以看到显示的图像是全黑的,完全没有意义。因此,当“打开”菜单项未被点击时,我们可以使“图像处理”菜单不可用。
然后在pjimage.m的OpeningFcn中,添加以下程序:
set(handles.m_image,' Enable ',' off ');
在Open菜单项的回调函数的末尾,添加以下程序:
set(handles.m_image,' Enable ',' on ');
在这种情况下,只要不点击“打开”,就不能使用“图像处理”菜单中的命令。效果如下:
点击“打开”就可以使用了。
接下来说前面的问题,就是问要不要保存图片。首先我们需要设置两个标志:一个是图片是否被处理过,一个是图片是否被保存过。然后我们在pjimage_OpeningFcn中添加以下两个应用程序数据。
setappdata(handles . figure _ pj image,' bSave ',false);
setappdata(handles . figure _ pj image,' bChanged ',false);
然后在“图像二值化”菜单项的回调函数中,将bChanged的值改为true,即添加以下程序:
setappdata(handles . figure _ pj image,' bChanged ',true);
因为我们要将图像保存在axis axes_dst中,而“文件”下的“保存”实质上是将图像保存在axis axes_src中,那么应该怎么做呢?我们必须添加另一个“保存”菜单项。这一次,我们向axis axes_dst添加了一个右键菜单。
打开工具栏中的菜单编辑器,并选择上下文。
菜单(上下文菜单),如下所示:
然后,创建新的上下文。
菜单,其标签属性为axes_dst_menu,如下所示:
然后给它添加一个菜单项:Save,它的Tag属性是axes_dst_menu_save,如上图。然后,右键单击axis axes_dst并选择“属性”
督察.将轴的UIContextMenu属性更改为axes_dst_menu。
如下图所示:
然后,保存并运行。右键单击axes_dst,您将看到“保存”菜单。我们来写一下它的功能。
[文件名,路径名] =
uiputfile({'*。bmp ',' BMP文件';'*.jpg'、' JPG文件' }、'选择一个图像');
如果
isequal(文件名,0) || isequal(路径名,0)
返回;
其他
fpath =完整文件(路径名,
文件名);
结束
img _ dst = getimage(handles . axes _ dst);
imwrite(img_dst,fpath);
setappdata(handles . figure _ pj image,' bSave ',true);
但是你会发现在看图之前右击axes_dst是有菜单的。一旦二进制化,当你再次右击时就没有菜单了。
但是,当我们在figure窗口的UIContextMenu中添加右键菜单axes_dst_menu(这里没有控件,双击打开figure的属性窗口)时,上述问题就不会发生,一切都会正常运行。因为,在添加到axes_dst时,一旦轴的内容发生变化,右键菜单就会附加到父对象上。因此,如果需要在坐标轴上显示右键菜单,将通过程序创建。如何创造,先不说。先说一下保存axis axes_dst,退出程序时该怎么做。
将原来的m_file_exit_Callback改为下面的程序:
b changed = getappdata(handles . figure _ pj image,' b changed ');%找零?
b save = getappdata(handles . figure _ pj image,' b save ');%获取保存?
如果
bChanged = = true & amp& ampBSave==false,%已更改但未保存。
BtnName=questdlg('您已经更改了图片,但没有保存。你想保存它吗?、'提示'、'保存'、'不保存'、'保存');%使用问题对话框
切换btnName,
案例“保存”,%执行axes_dst_menu_save_Callback的功能。
Fe val(@ axes _ dst _ menu _ save _ Callback,handles.axes_dst_menu_save,eventdata,handles);
案例“不保存”,%什么都不做。
结束
结束
h=findobj('Tag ',' figure _ im2bw ');%确定是否打开设置图像二值化参数的窗口。
如果
~isempty(h),%如果找到,关闭它。
关闭(h);
结束
close(findobj('Tag ',' figure _ pj image ');%关闭主窗口
让我们为程序添加一个工具栏。单击工具栏上的工具栏。
编辑器,打开以下内容:
选择“预定义”
在“工具”下打开,点击“添加”。再次选择“保存”并点击“添加”。并将“打开”按钮的标签属性更改为“TBL _打开”,将“保存”按钮的标签属性更改为“TBL _打开,保存”,如下所示:
点击“查看”找到打开按钮的回调,并在其下调用菜单中打开菜单项的回调,需要在打开按钮的回调下编写以下程序:
feval(@m_file_open_Callback,handles.m_file_open,eventdata,handles);
同理,找到保存按钮的回调,在它下面编写保存程序,但是我们需要判断是否是第一次保存,如果是,使用保存对话框;如果没有,我们可以直接保存在第一个保存的路径中。然后,我们还需要设置几个应用数据。第一个是记录是否第一次保存,第二个是记录第一次保存的路径。在这种情况下,我们在pjimage_OpeningFcn中添加以下代码:
setappdata(handles . figure _ pj image,' fstSave ',true);
setappdata(handles . figure _ pj image,' fstPath ',0);
然后,在Save按钮回调下,写下下面的程序:
FST save = getappdata(handles . figure _ pj image,' FST save ');
if(fstSave==true)
[文件名,路径名] = uiputfile({'*。bmp ',' BMP文件';'*.jpg',‘JPG档案’},
挑选一个图像’);
if isequal(filename,0) ||
isequal(路径名,0)
返回;
其他
fpath=fullfile(路径名,文件名);
结束
img _ dst = getimage(handles . axes _ dst);
imwrite(img_dst,fpath);
setappdata(handles . figure _ pj image,' fstPath ',fpath);
setappdata(handles . figure _ pj image,' bSave ',true);
setappdata(handles . figure _ pj image,' fstSave ',false);
其他
img _ dst = getimage(handles . axes _ dst);
fpath = getappdata(handles . figure _ pj image,' FST path ');
imwrite(img_dst,fpath);
结束
而且我们还需要文件下的“保存”按钮和工具栏中的“保存”按钮在打开图片之前是不可用的,只有在点击文件下的“打开”或者工具栏下的“打开”时才可用。然后需要在pjimage_OpeningFcn中添加以下代码:
set(handles.tbl_save,' Enable ',' off ');
set(handles.m_file_save,' Enable ',' off ');
并在m_file_open_Callback下,添加以下代码:
set(handles.tbl_save,' Enable ',' on ');
set(handles.m_file_save,' Enable ',' on ');
这么一个小程序就完了。
如果你能按照上面的步骤完成这个小程序,那么你就掌握了界面编程中的问题。