MATLAB图形用户界面的一个实例(2)

图像二值化处理GUI:

接着上一篇MATLAB图形用户界面的一个实例(1)我们来做一个图像二值化的一个图像处理。用之前的方法添加一个“图像处理”菜单,如下:

在其下面添加一个“图像二值化”的菜单项,如下:

然后,点击“OK”关闭菜单编辑器,并保存整个界面。如果我们的.m文件中没有对应的Callback时,我们可以点击上图中的“View”按钮来生成一个Callback函数。
图像二值化,有一个阈值的设置,那么我们可以新建一个界面,在这个界面上放一个滑动条来设置图像二值化的阈值。同时,有一个文本,显示当前滑动条的值。
那么我们新建一个空白界面,在它上面画一个Static Text和Slider控件,然后用工具栏的对齐工具(Align Objects),来对齐这两个控件。如下:

然后,将这个界面保存为im2bw_args.fig。整个设计如下:

你可以设置Static Text的FontSize属性为10,这样字体会更大一点。设置Static Text的Tag属性为txt_display,设置滚动条的Tag属性为slider_val。
为了能够在滚动条滚动时,Static Text显示滚动条的值,需要在滚动条的Callback中写下如下程序,你可以在滚动条上点击右键,选择“ViewCallbacks”下
的“Callback”直接进入滚动条的Callback函数(slider_val_Callback)。
val=get(hObject,'Value');
set(handles.txt_display,'String',num2str(val));

保存,运行程序,就可以滑动滚动条,而Static Text就会显示相应的值。在figure上双击打开figure(有方块的底层窗口)的属性窗口,将其Tag属性

设置为“figure_im2bw”,将其Name属性设置为“设置图像二值化阈值”。然后,保存界面。运行时,如下:

那么,我们想的是,当滑动条滑动时,将二值化的图像显示在pjimage.fig中的axes_dst坐标轴上的。那么怎么办呢?首先,要做的是,
当点击pjimage.fig菜单“图像处理”下的“图像二值化”的时候,会打开im2bw_args.fig。这个时候就是我们要调用im2bw_args.m的时候了。
当我们调用它的时候,会返回一个句柄,而这个句柄就是指向打开的im2bw_args.fig的。关于更详细的,你可以参看im2bw_args.m文件的最前面的注释,其中有这样写:
% H = IM2BW_ARGS returns the handle to a new IM2BW_ARGS or
the handle to
% the existing singleton*.

那就说明,我们可以如上的方式打开im2bw_args.fig。所以在“图像二值化”的Callback函数(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下的
滑动条的Callback函数中添加如下函数:
h_pjimage=getappdata(handles.figure_im2bw,'h_pjimage');
axes(h_pjimage.axes_dst);
img_src=getappdata(h_pjimage.figure_pjimage,'img_src');
bw=im2bw(img_src,val);
imshow(bw);

然后,在im2bw_args_OpeningFcn中添加:

h_pjimage=findobj('Tag','figure_pjimage');
h_pjimage=guihandles(h_pjimage);
setappdata(handles.figure_im2bw,'h_pjimage',h_pjimage);

然后,保存,运行。效果如下:


但是,如果在我们没有打开图片的情况下,要是点击了“图像二值化”会出现什么问题呢?可以看到显示的图像是全黑的,完全没有意义,如下图。所以,我们
可以在没有点击“打开”菜单项的时候,使“图像处理”菜单不可用。
那么在pjimage.m的OpeningFcn中,添加如下程序:
set(handles.m_image,'Enable','off');

在“打开”菜单项的Callback函数的最后,添加如下程序:

set(handles.m_image,'Enable','on');

这样的话,只要你不点“打开”,就不能用“图像处理”菜单中的命令。

总结:

最后总结下通过上面的小程序都掌握了什么?
一、打开对话框的使用,就是uigetfile函数的使用。需要注意的是,获得要打开的文件的路径时,我们的两种方法:一种是fpath=[pathname filename];另一种是fpath=fullfile(path,filename)。那么fullfile是Matlab为我们提供的一个函数。判断用户点击了“确定”还是“取消”按钮,可以看返回的filename和pathname是不是为0。
二、读入图片,就是imread函数的使用。imread函数读取图片成功之后,会返回读取图片的像素矩阵,如果像素矩阵是三维的,就代表这个图片有三个通道。就像RGB图片,有R通道、G通道和B通道一样。第一个像素就是每一维的矩阵的第一个值。
三、设置共享数据,就是setappdata和getappdata的使用。他们的第一个参数都是一个控件的句柄,第二个参数是你要设置或读取的应用程序数据的名字。如果是setappdata,那么第三个参数是你要设置的值。
四、保存图片,就是imwrite函数的使用。其第一个参数是图片的像素矩阵,也就是imread的返回值,第二个参数就是图片的完整路径,包括文件名。
五、保存对话框的使用,就是uiputfile函数。使用方法和uigetfile比较相似。
六、输入对话框的使用,就是inputdlg。注意,他的返回值是一个Cell类型的数据,也就是要通过{}来访问他的内部,而不是矩阵常用的()。
七、菜单编辑器的使用,包括菜单栏和右键菜单。
八、工具栏编辑器的使用。
九、在一个函数的Callback函数下,调用另一个函数。用feval函数,其第一个参数是一个函数句柄,后面是传递给该函数的参数。在界面编程中,hObject就是当前对象的句柄,比如pbtn_exit_Callback是一个Tag属性为pbtn_exit的按钮的Callback,那么在这个Callback里,hObject就等价于handles.pbtn_exit。至于eventdata是系统自动管理的,我们不用去更改。而handles则是一个结构体变量,通过控件的Tag属性,可以引用到控件的句柄。
十、两个GUI界面之间如何操作。通过findobj来查找另一个GUI,然后用guihandles将其转换为可用的GUI句柄。然后,就和在自己的.m文件里面使用一样,通过点操作来引用另一个GUI的控件,包括读取其应用程序数据。
十一、可以通过getimage函数来获取一个坐标轴中当前正在显示的图片的数据。
十二、通过axes函数来切换当前的坐标轴,也就是要在哪个坐标轴上画图。
十三、获取滑动条的值。
十四、设置静态文本的值。
十五、set和get的使用,这两个是最为常用的,用来设置或获取一个控件的某个属性。

附录:

im2bw_args.m最终源代码:
function varargout = im2bw_args(varargin)
% IM2BW_ARGS MATLAB code for im2bw_args.fig
%      IM2BW_ARGS, by itself, creates a new IM2BW_ARGS or raises the existing
%      singleton*.
%
%      H = IM2BW_ARGS returns the handle to a new IM2BW_ARGS or the handle to
%      the existing singleton*.
%
%      IM2BW_ARGS('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in IM2BW_ARGS.M with the given input arguments.
%
%      IM2BW_ARGS('Property','Value',...) creates a new IM2BW_ARGS or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before im2bw_args_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to im2bw_args_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help im2bw_args

% Last Modified by GUIDE v2.5 21-May-2016 20:20:56

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @im2bw_args_OpeningFcn, ...
                   'gui_OutputFcn',  @im2bw_args_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% --- Executes just before im2bw_args is made visible.
function im2bw_args_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to im2bw_args (see VARARGIN)

% Choose default command line output for im2bw_args
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes im2bw_args wait for user response (see UIRESUME)
% uiwait(handles.figure_im2bw);

h_pjimage=findobj('Tag','figure_pjimage');
h_pjimage=guihandles(h_pjimage);
setappdata(handles.figure_im2bw,'h_pjimage',h_pjimage);

% --- Outputs from this function are returned to the command line.
function varargout = im2bw_args_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% --- Executes on slider movement.
function slider_val_Callback(hObject, eventdata, handles)
% hObject    handle to slider_val (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,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

val=get(hObject,'Value');
set(handles.text_display,'String',num2str(val));

h_pjimage=getappdata(handles.figure_im2bw,'h_pjimage');
axes(h_pjimage.axes_dst);
img_src=getappdata(h_pjimage.figure_pjimage,'img_src');
bw=im2bw(img_src,val);
imshow(bw);

% --- Executes during object creation, after setting all properties.
function slider_val_CreateFcn(hObject, eventdata, handles)
% hObject    handle to slider_val (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

时间: 2024-08-05 09:46:03

MATLAB图形用户界面的一个实例(2)的相关文章

MATLAB图形用户界面的一个实例(1)

创建一个完整的Matlab/GUI步骤: 在MATLAB的命令窗口(Command Window)中运行guide命令,来打开GUIDE界面,如下: 然后,选择空模板(Blang GUI),点击OK,即可打开GUIDE的设计界面,如下: 点击工具栏上的菜单编辑器(Menu Editor),打开菜单编辑器,如下: 在Menu Bar中新建一个菜单项,名字为"文件",其他设置请看下图: 在"文件"菜单下添加菜单项:"打开","保存"

程序只启动一个实例的几种方法

我们在使用<金山词霸>时发现,在<金山词霸>已经运行了的情况下,再次点击<金山词霸>的图标,那么它不会再运行另外一个<金山词霸>,而是将已有的<金山词霸>给激活,始终只能运行一个<金山词霸>的实例. 在我们的程序当中如果要实现类似<金山词霸>的功能,就要解决两个问题,首先是要判断该程序已有一个实例在运行,其次是要将已运行的应用程序实例激活,同时退出第二个应用程序实例.  对于第一个问题,我们可以通过设置命名互斥对象或命名信

【React Native开发】React Native For Android环境配置以及第一个实例

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50456967 本文出自:[江清清的博客] (一)前言 FaceBook早期开源发布了React Native For IOS,终于在2015年9月15日也发布了ReactNative for Android,虽然Android版本的项目发布比较迟,但是也没有阻挡了广大开发者的热情.可以这样讲在2015年移动平台市场上有两个方向技术研究比较火,第一种为阿里,百度,腾讯

[VC]在VC++中实现让程序只运行一个实例的方法且实现该实例

方法一: 有时候在开发应用程序时,希望控制程序运行唯一的实例.例如,最常用的mp3播放软 件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程.在Visual C++的开发实践中,对于16位的Windows系统,应用程序的hPrevInstance句柄保存了应用程序上一个运行的实例,可以用该值来检查是否 有实例运行:然而在32位Windows系统下,这个值总是NULL,所以无法利用该值来实现程序运行唯一实例.本实例给出了解决这个问题的简单办法,只 要将程序中稍

C语言与MATLAB接口 编程与实例 李传军编着

罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ****************************************************** C-MEX函数:从MATLAB调用C语言或Fortran语言编写的函数. MEX文件:是一种按一定格式,使用C语言或者FORTRAN语言编写的,由MATLAB解释器自动调用并执行的动态链接函数.在Windows系统中,MEX

MATLAB工具箱及算法实例

核心函数: (1) function[pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 [输出参数] pop--生成的初始种群 [输入参数] num--种群中的个体数目bounds--代表变量的上下界的矩阵eevalFN--适应度函数eevalOps--传递给适应度函数的参数options--选择编码形式(浮点编码或是二进制编码)[precisionF_or_B],如precision--变量进行二进制编码时指定的

android Activity launch mode 一个实例 singleInstance

参考:http://blog.csdn.net/zhangjg_blog/article/details/10923643# singleInstance的特点可以归结为以下三条: 以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只会存在一个这样的实例 以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中(官方文档上的描述为,singleInstance模式的Activi

一个实例

通过一个实例,然后逐渐完善这个实例来进行学习. 也是大家很常见的一个游戏,猜数字游戏 打开IDLE,按下ctrl+n打开一个新的窗口,输入以下代码 保存后,按下F5运行 我们发现,Python和其他语言不一样,像Java.C都是要有大括号的,Python怎么没有啊. Python是靠缩进,通过缩进,Python代码看起来简洁,清晰.但是Python中的缩进不能乱用,缩进使用不当程序会报错. 通过上面的代码,我们可以了解很多Python的语法结构. 变量:Python的变量与Java这些语言而言,

目的:让目标程序在内存中只有一个实例

Q:为什么要实现这个目的?? A:因为有些程序 需要使用电脑上面的硬件,比如串口 采集卡之类的.这样情况下,程序在内存里面就只能 有一份,不然会抢夺硬件资源,造成各种问题. ×××××××××××××××××××××× 实现这个目的可能有很多种方式.不过此处我要使用的是CreateMutex()这个函数. 这个函数被定义在Kernel32里面.这个中文意译就是创建一个互锁. 函数原型: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttrib