Matlab毕业设计论文

在MATLAB的命令窗口中运行GUIDE命令,打开向导界面,如下图:

然后,选择一个空模板(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 ');

这么一个小程序就完了。

如果你能按照上面的步骤完成这个小程序,那么你就掌握了界面编程中的问题。