求教matlab gui 实现图像间运算 下拉菜单选择,按钮输出结果
错误提示(以除法为例)
??? Undefined function or variable 'im1'.
Error in ==> 0001>popupmenu_Callback at 92 im3=imdivide(im1,im2);
Error in ==> gui_mainfcn at 96 feval(varargin{:});
Error in ==> 0001 at 42 gui_mainfcn(gui_State, varargin{:});
Error in ==> @(hObject,eventdata)0001('popupmenu_Callback',hObject,eventdata,guidata(hObject))
??? Error while evaluating uicontrol Callback
关键代码在此
function popupmenu_Callback(hObject, eventdata, handles)
val=get(handles.popupmenu,'Value');
switch val
case 1
im3=imadd(im1,im2);
case 2
im3=imsubtract(im1,im2);
case 3
im3=immuliply(im1,im2);
case 4
im3=imdivide(im1,im2);
end
function OKpush_Callback(hObject, eventdata, handles)
axes(handles.axes3);
imshow(im3); 展开
原因很简单,回调函数popupmenu_Callback中没有定义变量im1和im2,你直接用这两个为定义的变量进行运算,当然会出错。
类似的问题在回调函数OKpush_Callback也有,那里面的im3同样也没有定义。
你需要明白,每一个回调函数都是“函数”,它们有各自独立的工作区,不能够把不同函数工作区的变量串着使用。要想在不同工作区之间交换数据,基本的做法有两种:
1、使用函数的输入参数表。
但由于GUI回调函数的参数形式是固定的,所以这种方法没有用。
2、使用全局变量。
例如,在读入图片的函数里定义global im1 im2
在 popupmenu_Callback里定义global im1 im2 im3
在OKpush_Callback里定义global im3
即可让你的代码运行(global应该在函数体的最前面)。
但是,使用全局变量尽管有时候比较方便,但不属于推荐的方式。做GUI推荐的做法有这样两种:
1、通过句柄获取数据。
回调函数的输入参数有handles这个变量,里面记录了GUI各要素的句柄,如果里面有图像的句柄,则可以通过get函数获取其CData属性,即为图像数据。
2、通过setappdata和getappdata传递数据。
例如,在读入图片的函数里加上:
setappdata(gcf,'im1',im1);
setappdata(gcf,'im2',im2);
在 popupmenu_Callback里加上:
im1=getappdata(gcf,'im1');
im2=getappdata(gcf,'im2');
%%%% 计算im3....
setappdata(gcf,'im3',im3);
在OKpush_Callback里加上:
im3=getappdata(gcf,'im3');
另外有个建议:你的popupmenu和OK按钮二者的代码其实可以合并:
如果希望选完popup就立即显示新图像,则可以把OKpush_Callback的代码并入到popupmenu_Callback的后面;
如果按OK按钮才显示新图像,则可以把popupmenu_Callback的代码并入到OKpush_Callback的前面。
写了这么多,希望对楼主有帮助。满意的话请采纳,若有疑问可继续追问。
其实昨天就查到了,不过还是要谢谢你,我设置了全局变量来解决
我还有其他问题,
图片间的加减乘除运算怎么解决两张图片大小必须一致的问题,是强制调整大小还是添加一个"图片大小不一致的"错误提示?我查不到这方面的代码
使用全局变量不是好习惯,但是,对于自编自用的小规模程序,偶尔用一用也无妨。要想学习比较规范的做法,建议看看我上面写的内容,相信对你会有帮助。
两张图片大小不一致时,究竟调整大小,还是给出错误提示?这个你不应该问别人,而应该看你自己的选择。都是可以实现的,你可以自行决定采取哪种做法:除了上面你说的两种之外,还可以弹出对话框提示,让用户决定采取哪种做法;或者调整大小进行运算的同时给出一个警告信息,让用户知道发生了什么。