Matlab中图片保存的四种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab中图片保存的四种方法
一种是出来图形窗口后手动保存(这儿又可以分两种):
1 直接从菜单保存,有fig,eps,jpeg,gif,png,bmp等格式。
2 edit------〉copy figure,再粘贴到其他程序。
另一种是用命令直接保存(这里也有两种):
1 用saveas命令保存图片。
saveas的三个参数:
(1)图形句柄,如果图形窗口标题栏是“Figure 3”,则句柄就是3.
(2)文件名。
(3)单引号字符串,指定存储格式。
例:
saveas(gcf,['D:\MATLAB7\work','yanbao',num2str(k),'.jpg']);
2 使用plot函数后紧接着用print函数。
print的三个参数:
(1)图形句柄,如果图形窗口标题栏是“Figure 3”,则句柄就是3.(2)单引号字符串,指定存储格式。
用gcf可以获取当前窗口句柄。
png格式:'-dpng'
jpeg: '-djpeg',
tiff: '-dtiff'
bmp: '-dbitmap'
(3)文件名。
例:
>> x=-pi:2*pi/300:pi;
>> y=sin(x);
>> plot(x,y);
>> print(gcf,'-dpng','abc.png') % 保存为png格式的图片。
>> figure(2) % 新建一个句柄为2的图形窗口。
>> plot(x,cos(x)); % 在句柄为2的图形窗口上画图。
>> grid
>> print(2,'-djpeg','C:\abc.jpeg'); %将句柄为2的图形保存为jpeg/jpg格式的图片,文件名为'C:\abc.jpeg'。
Matlab图像处理函数:regionprops
这里给出在Matlab图像处理工具箱中非常重要的一个图像分析函数:regionprops。
顾名思义:它的用途是get the properties of region,即用来度量图像区域属性的函数。
语法
STATS = regionprops(L,properties)
描述
测量标注矩阵L中每一个标注区域的一系列属性。
L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。
返回值STATS是一个长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。
properties 可以是由逗号分割的字符串列表、饱含字符串的单元数组、单个字符串'all' 或者'basic'。
如果properties 等于字符串'all',则所有下述字串列表中的度量数据都将被计算,如果properties 没有指定或者等于'basic',则属
性: 'Area', 'Centroid', 和'BoundingBox' 将被计算。
下面的列表就是所有有效的属性字符串,它们大小写敏感并且可以缩写。
属性字符串列表Area EquivDiameter MajorAxisLength
BoundingBox EulerNumber MinorAxisLength
Centroid Extent Orientation
ConvexArea Extrema PixelIdxList
ConvexHull FilledArea PixelList
ConvexImage FilledImage Solidity
Eccentricity Image
属性详细定义
本部分将结合一个具体的例子说明各种字串相关属性的意义,矩阵取自在蚁蛉模式识别中做过预处理后的斑纹分割图像,如下图:
这是一幅二值图像,在应用regionprops函数之前必须将其标注,可以调用bwlabel函数和伪彩色处理,标注后的图像如下图:
下面基于以上的材料来考察属性的含义。
'Area'
是标量,计算出在图像各个区域中像素总个数。
注意:这个数值可能与由函数bwarea 计算的值有轻微的不同。
对于这样一个数值,我们可以使用它除以整个图像区域的像素个数而得到斑纹比例,可以作为模式识别的候选特征,并且这个特征是仿射不变的。
在本例中最后计算出的面积向量是
[3.8952,9.7213,17.663,3.5762,1.3432,1.6958,0.41974,0.41974,21.625,12.3 24,4.8187,1.5111]/10000.
'BoundingBox'
是1行ndims(L)*2列的向量,即包含相应区域的最小矩形。
BoundingBox 形式
为[ul_corner width],这里ul_corner 以[x y z ...] 的坐标形式给出边界盒子的左上角、boxwidth 以[x_width y_width ...] 形式指出边界盒子沿着每个维数方向的长度。
本例的各部分区域最小矩形如下图!注意:请在这熟悉一下函数rectangle的使用方法。
'Centroid'
是1行ndims(L)列的向量,给出每个区域的质心(重心)。
注意:Centroid 的第一个元素是重心水平坐标(x坐标)、第二个元素是重心垂直坐标(y坐标)。
Centroid 所有其它元素则按照维顺序排列。
下图采用以中心为圆心的小圆来演示质心检测的效果:
图中各质心坐标(标准化后的)依次为:
(x,y)= 0.10478, 0.76739 0.11883, 0.081545 0.19586, 0.61092 0.30701, 0.3 0807 0.65712, 0.31613 0.73165, 0.30531 0.74548, 0.35378 0.80624, 0.728 02 0.84546, 0.61564 0.90554, 0.079574 0.93477, 0.77871 0.97611, 0.1557 6
'MajorAxisLength'
是标量,与区域具有相同标准二阶中心矩的椭圆的长轴长度(像素意义下)。
本属性只支持二维标注矩阵。
'MinorAxisLength'
是标量,与区域具有相同标准二阶中心矩的椭圆的短轴长度(像素意义下)。
本属性只支持二维标注矩阵。
'Eccentricity'
是标量,与区域具有相同标准二阶中心矩的椭圆的离心率(可作为特征)。
本属性只支持二维标注矩阵。
'Orientation'
是标量,与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)。
本属性只支持二维标注矩阵。
本例的各区域椭圆数据为:长轴:
18.767,45.172,43.003,30.687,16.505,15.698,5.8833,5.8833,46.954,38.873,22.929,15.429 短轴:16.211,26.079,32.709,9.8458,6.8019,8.6386,5.8833,5.8833,35.976,31.022,16.98,7.8038 离心率:0.50387,0.81652,0.6492,0.94713,0.91114,0.83497,0,0,0.64262,0.60262,0.67205,0.86266 方向角:-29.219,-32.192,-9.3909,-50.904,-70.333,48.823,0,0,14.035,17.986,3.0319,-34.238
我们可以考察离心率的变化趋势,得到对于整个区域中的各区域的似圆性如何的大致感觉,比如下图是12个区域的离心率变化情形:
由上图可以看出区域整体的似圆性并不好,实际上可以考虑使用离心率向量作为一个模式识别的特征!!
'Image'
二值图像,与某区域具有相同大小的逻辑矩阵。
你可以用这个属性直接将每个子区域提取出来,然后再作相应的处理!比如本例的第一个斑纹区域提出后是:
'FilledImage'
与上相同,唯一区别是这是个做了填充的逻辑矩阵!
本例中和上面的没有区别,只有区域有空洞时才有明显差别。
'FilledArea'
是标量,填充区域图像中的on 像素个数。
'ConvexHull'
是p行2列的矩阵,包含某区域的最小凸多边形。
此矩阵的每一行存储此多边形一个顶点的xy坐标。
此属性只支持2维标注矩阵。
例如:本例中的所有子区域的最小凸多边形图形如下图
'ConvexImage'
二值图像,用来画出上述的区域最小凸多边形。
同时此凸包内的像素均打开,图像尺寸和此区域对应边界矩形相同。
此属性只支持2维标注矩阵。
例如:本例中的第2个子区域的最小凸多边形图形为。
注意:此处函数roipoly很有用!
'ConvexArea'
是标量,填充区域凸多边形图像中的on 像素个数。
'EulerNumber'
是标量,几何拓扑中的一个拓扑不变量--欧拉数,等于图像中目标个数减去这些目标中空洞的个数。
此属性只支持2维标注矩阵。
本例中的欧拉数均为1。
'Extrema'
8行2列矩阵,八方向区域极值点。
矩阵每行存储这些点的xy坐标,向量格式
为[top-left top-right right-top right-bottom bottom-right bottom-left left-bottom left-top]。
此属性只支持2维标注矩阵。
'EquivDiameter'
是标量,等价直径:与区域具有相同面积的圆的直径。
计算公式为:sqrt(4*Area/pi)。
. 此属性只支持2维标注矩阵。
本例标准化后的12区域直径向量为:
[2.227,3.5182,4.7423,2.1339,1.3077,1.4694,0.73105,0.73105,5.2473,3.961 2,2.477,1.3871]/100.
'Solidity'
是标量,同时在区域和其最小凸多边形中的像素比例。
计算公式为:Area/ConvexArea,这也是个仿射特征,实际上反映出区域的固靠性程度。
此属性只支持2维标注矩阵。
本例12区域凸元素比例向量为:
[0.97071,0.66171,0.90846,0.86585,0.84211,0.94393,1,1,0.9096,0.75514,0. 90823,0.94737].
'Extent'
是标量,同时在区域和其最小边界矩形中的像素比例。
计算公式为:Area除以边界矩形面积,这也是个仿射特征,实际上反映出区域的扩展范围程度。
此属性只支持2维标注矩阵。
不再给出计算结果!!
'PixelIdxList'
p元向量,存储区域像素的索引下标。
'PixelList'
p行ndims(L)列矩阵,存储上述索引对应的像素坐标。
支持类
输入的标注矩阵L可以有任意的数值类型。
提醒
使用逗号分割列表语法
当你基于regionprops函数的输出作算法设计时,使用逗号分割列表语法就凸显出其非常的价值。
例如:对于一个存储标量的属性,可以利用此语法创建一个包含图像中不同区域内此属性值的向量。
例如以下两句是等价的:
stats(1).Area, stats(2).Area, ..., stats(end).Area
stats.Area
因此,可以使用下面的方法创建相应的向量:
regionprops(L,'Area'); allArea = [stats.Area];
allArea 就是一个与结构数组stats 具备相同长度的向量。
基于特定原则的区域选择
当你要基于特定准则条件选择某个区域时,将函数ismember 和regionprops 联合使用是很有用处的。
例如:创建一个只包含面积大于80的二值图像,用以下命令
idx = find([stats.Area] > 80); BW2 = ismember(L,idx);
ismember解释:
a=[1 2 3 4 5];
b=[3 2 5 6 7 8 77 44 3];
[tf index]=ismember(a,b); %判断a中的元素有没有在b中出现
tf =
0 1 1 0 1
index =
0 2 9 0 3
%tf返回一个和a同样大小的矩阵,a的元素在b中出现,tf上的相应位置元素值为1,没有出现则为0;index也是返回一个和a同样大小的矩阵,其相应位置的值为a相应位置
的元素在b中出现的最后标号,注意是最后的标号,若某元素在b中出现多次,则记录的是最后一次出现的标号,若该位置上的a的元素没有在b中出现,则返回0.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%
计算性能考虑
大多数的属性测量计算时间都非常地少,除了那些非常依赖于图像L中区域个数和像素个数的属性。
例如:
'ConvexHull' 'ConvexImage' 'ConvexArea' 'FilledImage'
另外建议一次性计算所有属性值,因为分开计算和一起计算时间相差无几!
使用二值图像工作
在调用regionprops之前必须将二值图像转变为标注矩阵。
两个函数可以做到:
L = bwlabel(BW); L = double(BW);
注意:虽然这两个函数从同一二值图像产生不同的标注矩阵,但是它们是等效的!例如:给出如下的二值矩阵BW,
1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1
bwlabel 创建一个包含两个分别由整数1和2标注的连续区域标注矩阵
mylabel = bwlabel(BW) mylabel = 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 2 2
double 创建一个包含一个由整数1标注的不连续区域标注矩阵。
mylabel2 = double(BW) mylabel2 = 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1
regionprops 并不负责自动转换二值图像数据类型,而是由你自己决定使用何种数据转换方法来存储自己想要的数据。
regionprops函数的扩展思路
在regionprops函数的基础上,你可以使用它提供的基本数据来扩展它的功能,将区域的曲率数据和骨架数据作为它的另外属性值来开发,从而希望它能用来做更细致的特征提取。
分类: matlab
MATLAB GUI平台
研究生阶段写的一个小文章,内容肤浅,不过转载请注明,谢谢!!
摘要:本文主要介绍了基于MATLAB的图形用户界面(GUI)来制作图像处理软件平台的具体过程和相关技巧,文章主要从几个方面展开论述:第一,简单介绍下GUI与GUIDE;第二,介绍以下GUIDE的模板及其操作方法;第三,详细阐述一下图像处理软件平台的制作方法。
本文的GUI例子所制作的图像处理软件可以实现的功能有:五种常用的边缘检测、灰度直方图的显示、灰度直方图的均衡化、对比度自适应直方图的均衡化、图片的二值化以及彩色图片的灰度化。
文章基本介绍了以上的内容,关于软件还有许多未能实现的功能有待于日后的逐步开发,从这个简单的实例可以让读者从感性的方面充分了解MATLAB的图形用户界面的相关功能,同时为打算深入学习这一套MATLAB工具集的读者做一个铺垫。
关键词:图形用户界面;图像处理;边缘检测;MATLAB工具集
一、引言
图形用于界面(Graphical User Interfaces,GUI)是提供人机交互的工具和方法。
GUI 是包含图形对象(如窗口、图标、菜单和文本)的用户界面。
以某种方式选择或激活这些对象时,通常会引起动作或者发生变化。
一个设计优秀的GUI能够非常直观的让用户知道如何操作MATLAB界面,并且了解设计者的开发意图。
MATLAB的GUI为开发者提供了一个不脱离MATLAB的开发环境,有助于MATLAB程序的GUI集成。
这样可以使开发者不必理会一大堆烦杂的代码,简化程序,但是同样可以实现向决策者提供图文并茂的界面,甚至达到多媒体的效果。
可以说MATLAB提供了一个简便的开发环境,可以让开发者快速上手,提高了开发者的工作效率。
所谓的GUIDE就是图形用户界面开发环境(Graphical User Interface Development Environment),它向用户提供了一系列的创建用户图形界面的工具。
这些工具大大简化了GUI设计和生成的过程。
GUIDE可以完成的任务有如下两点:1)输出GUI。
2)GUI 编程。
GUIDE实际上是一套MATLAB工具集,它主要由七部分组成:版面设计器、属性编辑器、菜单编辑器、调整工具、对象浏览器、Tab顺序编辑器、M文件编辑器。
二、GUIDE的操作界面及使用方法的介绍
1.启动GUIDE在命令窗口中直接键入guide,启动GUIDE,或者直接点击MATLAB 上按钮,会出现如图1所示的GUIDE Quick Start对话框。
利用GUIDE模板创建GUI,或者打开已经存在的GUI,单击OK按钮,打开版面设计工具,如图2所示。
在通常状况下组件面板并不显示出组件的名称,如果需要显示组件名称,则进行下面的操作:从File 菜单中选择Preferences选项,勾选Show names in component palette选项即可。
2.GUI文件的介绍GUIDE把GUI设计的内容保存在两个文件中,它们在第一次保存或运行时生成。
一个是FIG文件,扩展名为.Fig,它包含对GUI和GUI组件的完整描述;另外一个是M文件,扩展名为.M,它包含控制GUI的代码和组件的回调事件代码。
这两个文件与GUI显示和编程任务相对应。
在版面设计器中创建GUI时,内容保存在FIG文件中;对GUI编程时,内容保存在M文件中。
通常情况下在版面设计器工具栏上单击图标可以打开M文件编辑器。
图3所示的编辑器显示了GUI with Axes and Menu模板的M文件的内容。
3.GUIDE环境的设置用户可以自定义GUIDE设计环境。
在File菜单下选择Preferences,打开如图4所示的设置对话框,可以进行相应的设置。
三、基于GUI的图像处理软件平台的设计过程
1.GUIDE版面设计器(即FIG文件)的设计根据设计需要:首先拖拽两个图形窗口(Axes),一个作为待处理图片区域,另一个作为已处理图片区域;其次,拖拽六个电子按钮(Radio Button),作为边缘检测操作按钮以及一个Panel按钮作为检测按钮的支撑面板;第三,拖拽三个按钮(Push Button),作为灰度变化区域的按钮;最后,拖拽五个按钮(Push Button),作为选取/保存图片及退出等操作按钮。
将上面的所有按钮及图形窗口合理的布局,达到美观工整的效果,本文设计的GUIDE如图5所示,然后运行一下GUI,系统会自动生成GUI文件。
图5 图像处理软件的GUIDE版面
2.选取图片按钮的GUI设计要想设计一个图像处理的软件,首先要考虑选取图片,选取什么格式的图片,这个是至关重要的,所以先介绍一下选取图片按钮的GUI设计方法。
上面已经规划好了按钮的位置,如果想在点击选取图片按钮时,软件给予响应,需要给按钮输入一定的程序代码,设置代码的方法如下:右键单击选取图片按钮,选择View Callbacks/ Callback,系统会自动带设计者进入此按钮的代码输入区域,在下面的空白处输入如下代码[1]:
global im %定义一个全局变量im
[filename,pathname]=...
uigetfile({'*.*';'*.bmp';'*.tif';'*.png'},'select picture'); %选择图片路径
str=[pathname filename]; %合成路径+文件名
im=imread(str); %读取图片
axes(handles.axes1); %使用第一个axes
imshow(im); %显示图片
写完上述代码后,保存M文件,然后运行GUI,现在就可以实现选择图片的功能了。
当然有选取就要考虑存储已处理好的图片,这就引出了存储图片按钮的GUI设计。
3.存储图片按钮的GUI设计同样右键单击存储图片按钮,选择View Callbacks/ Callback,进去M文件后在下面的空白处输入如下代码[2]:
global BW %定义处理后的图片BW这个全局变量
[filename,pathname,filterindex]=...
uiputfile({'*.bmp';'*.tif';'*.png'},'save picture');存储图片路径
if filterindex==0
return %如果取消操作,返回
else
str=[pathname filename]; %合成路径+文件名
axes(handles.axes2); %使用第二个axes
imwrite(BW,str); %写入图片信息,即保存图片
end
4.边缘检测按钮组的GUI设计本文设计的GUI主要包含了五种最常用的检测算法(即roberts、sobel、prewitt、log、canny检测),右键单击Panel面板,选择View Callbacks/ SelectionChangeFcn,进入M文件后在空白处输入如下代码[3]:
global im
global BW %定义全局变量
str=get(hObject,'string'); %拿到所选按钮的名称
axes(handles.axes2); %使用第二个axes
switch str %选择语句
case'Initial' %点击原图按钮
imshow(im); %显示原图
case'Roberts' %点击Roberts边缘检测按钮
BW=edge(im,'roberts');
imshow(BW);
case'Sobel' %点击Sobel边缘检测按钮
BW=edge(im,'sobel');
imshow(BW);
case'Prewitt' %点击Prewitt边缘检测按钮
BW=edge(im,'prewitt');
imshow(BW);
case'Log' %点击Log边缘检测按钮
BW=edge(im,'log');
imshow(BW);
case'Canny' %点击Canny边缘检测按钮
BW=edge(im,'canny');
imshow(BW);
end;
5.退出按钮的GUI设计同样右键单击退出按钮,选择View Callbacks/ Callback,进入M文件中,在空白处输入如下代码:
close(gcf) %关闭当前Figure窗口句柄
其他按钮代码的设置都与上面叙述的大同小异,相关图像处理程序代码请参考MATLAB7.0图形图像处理[4],在这里将不再累述。
四、图像处理软件的运行举例
运行GUI,将生成图像处理的软件平台,它可以实现的功能有:五种常用的边缘检测、灰度直方图的显示、灰度直方图的均衡化、对比度自适应直方图的均衡化、图片的二值化以及彩色图片的灰度化。
现在运行软件并举些相关图像处理实例。
1.灰度图片边缘检测的举例首先选择一幅名字为lena256的灰度图片,依次选择五种检测按钮,比较各种边缘检测的处理效果,通过对比,发现Canny
算子对图片的边缘检测效果比较好,其检测效果如图6所示,其它4种算子检测后的效果如图7所示。
2.灰度图片的直方图显示举例选取名字为cameraman的灰度图片,点击直方图的显示按钮,此灰度图片的直方图分布将显示在第二个axes中,其处理结果如图8所示。
3.彩色图片的二值化和灰度化处理举例选取名字为Water lilies的彩色图片,分别点击二值化和灰度化按钮并保存处理后的图片,其处理后的图片效果如图9所示。
五、结束语
由于MATLAB强大的工程计算和仿真能力,使越来越多的用户从原来的开发环境转到MATLAB上来。
现在绝大多数MATLAB开发者都是一些从事一定领域的研究者,他们使用其他的开发环境设计GUI不紧编程复杂、而且学习困难,往往需要花费大量时间在编程上。
但是,MATLAB提供了一个简便的开发环境,可以让开发着快速上手,提高了开发者的工作效率。
本文详细向读者介绍了MATLAB的GUI的制作方法,通过这个例子,可以清楚的了解GUIDE的设计方法及相关图像处理代码的编辑,使读者从感性的角度认识GUIDE的功能及使用方法,可以说为初学者提供了一个学习平台,打下坚实的基础
如何利用Matlab进行usb摄像头
首先自己的电脑有个摄像头,如果没有插上USB摄像头,然后再启动Matlab(顺序不可返的)。
方法:
查询USB2.0Camera 的具体参数:
输入:imaqInfo = imaqhwinfo
返回:
imaqInfo =
InstalledAdaptors: {'coreco' 'winvideo'}
MATLABVersion: '7.6 (R2008a)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '3.1 (R2008a)'
输入:winvideoinfo = imaqhwinfo('winvideo')
返回:
winvideoinfo =
AdaptorDllName: 'C:\Program
Files\MATLAB\R2008a\toolbox\imaq\imaqadaptors\win32\mwwinvideoimaq.dl l'
AdaptorDllVersion: '3.1 (R2008a)'
AdaptorName: 'winvideo'
DeviceIDs: {[1]}
DeviceInfo: [1x1 struct]
输入:winvideoinfo.DeviceInfo
返回:
ans =
DefaultFormat: 'YUY2_160x120'
DeviceFileSupported: 0
DeviceName: 'USB2.0 Camera'
DeviceID: 1
ObjectConstructor: 'videoinput('winvideo', 1)'
SupportedFormats: {'YUY2_160x120' 'YUY2_176x144' 'YUY2_320x240'
'YUY2_352x288' 'YUY2_640x480'}
到此为止!最后一行可以看出你的相机支持的分辨率,我的usb摄像头最高支持640*480的
在语句中设置:
vid=videoinput('winvideo',1,'YUY2_640x480');
set(vid,'TriggerRepeat',Inf);
set(vid,'FramesPerTrigger',1);
set(vid,'FrameGrabInterval',1);
%设置返回色彩……
% set(vid,'ReturnedColorSpace','rgb');
set(vid,'ReturnedColorSpace','grayscale');
%获取分辨率,色彩数目等参数
vidRes=get(vid,'VideoResolution');
nBands=get(vid,'NumberOfBands');
hImage=image(zeros(vidRes(2),vidRes(1),nBands));
preview(vid,hImage);
Matlab的GUI编程中实现axes控件上没有坐标轴
有时候,自己编写的GUI中的axes用于显示图像,此时你不想让程序刚开始运行的时候显示坐标轴等信息,这是,你可以进行如下设置:
在你的每一个axes的CreateFcn函数中添加一下代码即可:
set(hObject,'xTick',[]);
set(hObject,'ytick',[]);
set(hObject,'box','on');
Matlab中GUI之间的参数传递
今天,研究了一下不同GUI之间的参数传递方法,Matlab中GUI之间参数传递不如VC 一样简单,易于理解,但是如果理解了,也是有章可循的,传说的具有六种方法,介绍其中的一种,如下所示:
**运用gui本身的varain{}、varaout{}传递参数。
上面介绍的方法只是适用于主从GUI之间传递参数,即从主GUI调用子GUI,然后关掉子GUI,子GUI的参数就传递到了主GUI,比如子GUI的名称为subGUI, 设想的参数输入
输出为:[out1, out2] = subGUI(in1, in2)
在subGUI的m文件中(由GUIDE自动产生),varargin 和varargout 分别是一个可变长度的cell数组(MATLAB帮助文件中有说明)。
输入参数in1和in2保存在varargin 中,输出参数out1,out2包含在varargout中;在subGUI的OpeningFcn中,读入参数,并用guidata保存,即:handles.in1 = varargin{1};handles.in2 = varargin{2}; guidata(hObject, handles);
返回参数的设置:
1. 在GUI子程序的OpeningFcn函数的结尾加上uiwait(handles.figure1); figure1是subGUI的Tag;
2. subGUI中控制程序结束(如"OK”和"Cancel"按钮)的callback末尾加上uiresume(handles.figure1),不要将delete命令放在这些callback中;
3. 在子GUI的OutputFcn中设置要传递出去的参数,如varargout{1} = handles.out1;varargout{2} = handles.out2;末尾添加delete(handles.figure1); 结束程序。
在GUI的OpenFcn中,如果不加uiwait,程序会直接运行到下面,执行OutputFcn。
也就是说程序一运行,返回值就确定了,再在其它部分对handles.output作更改也没有效果了。
加上uiwait后,只有执行了uiresume后,才会继续执行到OutputFcn,在此之前用户有充分的时间设置返回值。
通过以上设置以后,就可以通过[out1, out2] = subGUI(in1, in2) 的形式调用该子程序。
在一个GUI中调用另一个GUI时,主GUI不需要特别的设置,同调用普通的函数一样。
在打开子GUI界面的同时,
主程序还可以响应其它的控件。
不需要担心子GUI的返回值被传错了地方。
综上所述:一是,两点需要注意,uiwait和uiresume的使用位置和使用时机,二是,delete 句柄的位置……
延续以前的博文,今天介绍一下方法二,利用setappdata和getappdata函数进行不同GUI之间的参数传递问题。
getappdata函数,VALUE=getappdata(H,NAME);setappdata函数,setappdata(H,NAME,VALUE)。
具体地应用如下所示:
当在主子gui内调用时,可以如下设置:fig1调用fig2时,使用fig2指令来打开fig2,在fig2的m文件中,在回调函数中用setappdata(fig1,'A',A)实现返回fig1,并将参数A 传递给fig1,然后在fig1的使用A的地方添A=getappdata(fig1,‘A’)。
但这种方式的一个问题就是没调用一次,fig1的数据就得初始化一次,这是因为
setappdata(fig1,'A',A)中出现了fig1,调用一次setappdata就得运行一次fig1的缘故,解决方案就是把setappdata(fig1,'A',A)改为setappdata(0,'A',A),这样把A读入matlab workspace,相当于一个全局变量了,但当然比直接用global定义全局变量好!必须注意的是:在主程序和子程序中均要用0,否则不管用……
此方法和第一种的不同即:第一种是启动主程序后,再启动子程序,进行设置参数,而这一种方法是先启动子程序,设置好参数后,启动主程序,这是参数已经传到主程序……
前面有了两种方法了,今天就研究一下第三种方法,这种方法在GUI内的数据传递也是比较常用的:全局变量。
这种方式恐怕是最简单的方式,是很省心!但是,简单的问题就在于有时你会很头疼!
因为在每一个要到该全局变量的地方,你都要添一句gloal x,还有就是如果你在一个地方修改了x的值,那么所有x的值就都变了!有的时候恐怕会出现紊乱。
另一个更重要的问题在于,套用C++的一句话,全局变量破坏了程序的封装性!所以,全局变量是能少用尽量少用。
参数传递:
假如我在 myGui_OpeningFcn 中计算得到了以下几个参数 y (符号方程)xInput ,(1*600向量),xx (10*1向量),现在需要在按下某一按键时调用这些数据完成进一步的计算,按键的回调函数为 pushbutton1_Callback
则,可以使用如下的方式来达到我们的目的:
function myGui_OpeningFcn(hObject, eventdata, handles, varargin)
% 程序代写&算法设计,联系qq:380238062,转载时请保留
[y,xInput,xx] = myFun1(); %参数获得
data{1} = y;data{2} = xInput;data{3} = xx; %将数据存入元胞数组
handles.data = data; %将data存到handles里面
guidata(hObject, handles); %这句要紧根上一句,实现数据更新
function pushbutton1_Callback(hObject, eventdata, handles)
data = handles.data; %实现数据传递
y = data{1};xInput = data{2};xx = data{3};
myFun2(y,xInput,xx); % 正常使用得到的数据即可
结果显示:
假如我们的界面功能是对图像进行去噪,在处理后要显示结果图像的信噪比,可使用以下方法
1. 首先在GUI中加入一个edit,假设该edit的TAG为edit1
2. 在控件的回调函数中进行信噪比的计算及显示:
function pushbutton1_Callback(hObject, eventdata, handles)
% 程序代写&算法设计,联系qq:380238062,转载时请保留
snr = myFun(oriImage,outImage);
set(handles.edit1,'string',num2str(snr)); %数据显示
图像清除:
在同一个axes中显示图像时,经常会遇到需要将已显示的图像进行清除的情况,可用以下方法实现:
function pushbutton1_Callback(hObject, eventdata, handles)
h = getHandle(); %得到axes的句柄
reset(h); %清除已画的曲线
guidata,handles的理解(转)
2015-07-20 07:58 95人阅读评论(0) 收藏举报分类:
Matlab(13)
guidata其实其关键主要是应用在不同控件参数传递中,也许有些人会应用global来实现全局变量的传递,但是这样来说太麻烦了,有时也有些不便,而guidata却非常之方便.
1..guihandles(figure1)可以得到一个结构体包含了figure1的所有控件的TAG 及其句柄,
2比如说你想在一个控件中构造一个变量,并且希望能在其它控件中使用,这时候你可以通过下面的方法
handles.fdafdaf=*******(fadadaf是你随便取的一个名字,其实就相当于每一个控件的TAG名,而这个变量会储存在handles结构之中)
guidata(hObject,handles) (UPDATE YOUR HANDLES)(i当然你构造了一个变量,要对其进行储存,如果不储存,其它控件中将不能使用它)
3 当然对于储存这种参数,你不一定使用handles ,也可以换个名字,比如说DATA,这点在MATLAB HELP 里面讲得还是比较清楚的.
4,内联函数即inline
在matlab命令窗口、程序或函数中创建局部函数时,可用inline。
优点是不必将其储存为一个单独文件。
在运用中有几点限制:不能调用另一个inline函数,只能由一个matlab表达式组成,并且只能返回一个变量---显然不允许[u,v]这种形式。
因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用inline。
除了这些限制,在许多情况下使用该函数非常方便。
Inline函数的一般形式为:
FunctionName=inline(‘任何有效的matlab表达式’, ‘p1’,’p2’ ,….) ,其中‘p1’,’p2’ ,…是出现在表达式中的所有变量的名字。
5匿名函数,是构造简单函数的一种方法
比如定义f(x)=x^2,可以写为
f=@(x)(x.^2)
其中@(x)(x.^2)就是匿名函数,第一个括号里面是自变量,第二个括号里面是表达式,@是函数指针
f=@(x)(x.^2)表示将匿名函数@(x)(x.^2)赋值给f,于是f就表示该函数。
于是f(2)=2.^2=4;f(1:3)=[1:3].^2=[1 4 9]等等
定义匿名函数时也可以调用别的匿名函数,比如
f1=@(x,y)(x.^2+y.^2)
定义了函数x^2+y^2
f2=@(t)(f1(t,2))
定义了函数t^2+4
f3=@(x)(f1(x(1),x(2)))
定义了函数x(1)^2+x(2)^2
使用匿名函数时一定要注意函数本身的参数形式,如。