求教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的前面。

     

写了这么多,希望对楼主有帮助。满意的话请采纳,若有疑问可继续追问。

追问

其实昨天就查到了,不过还是要谢谢你,我设置了全局变量来解决
我还有其他问题,
图片间的加减乘除运算怎么解决两张图片大小必须一致的问题,是强制调整大小还是添加一个"图片大小不一致的"错误提示?我查不到这方面的代码

追答

使用全局变量不是好习惯,但是,对于自编自用的小规模程序,偶尔用一用也无妨。要想学习比较规范的做法,建议看看我上面写的内容,相信对你会有帮助。

两张图片大小不一致时,究竟调整大小,还是给出错误提示?这个你不应该问别人,而应该看你自己的选择。都是可以实现的,你可以自行决定采取哪种做法:除了上面你说的两种之外,还可以弹出对话框提示,让用户决定采取哪种做法;或者调整大小进行运算的同时给出一个警告信息,让用户知道发生了什么。

追问

其实我想知道这两种方法的任意一种方式的代码,那种都无所谓,都能达到我的目的,可是哪种代码我都不会,也查不到 ,所以只要告诉我一种就可以,能举出几个例子就更好了

追答

这个代码太容易了吧?
直接判断两个数组im1和im2维数是否匹配就可以了。

% 如果图片尺寸不同,则提问由用户决定是否继续处理
if ~isequal(size(im1),size(im2))
a=questdlg('Image size not match. Continue anyway?', 'Question', 'Yes', 'No', 'Yes');
if ~strcmp(a, 'Yes')
return
end
end

% 用户如果选择不继续,则前面的判断已经返回,运行到这里说明用户选择了继续
% 后面按照调整大小继续处理

温馨提示:答案为网友推荐,仅供参考
相似回答