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

来源:互联网 发布:cc3d飞控调参软件 编辑:程序博客网 时间:2024/06/06 13:11

图像二值化处理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 orthe 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 EDITgui_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});endif 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_argshandles.output = hObject;% Update handles structureguidata(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 structurevarargout{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 sliderval=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


0 0
原创粉丝点击