0

我在 MATLAB 中创建了一个图像编辑器窗口,其中包括各种操作,包括亮度、对比度、裁剪、旋转等。在这个 GUI 中,每个操作都有自己的函数回调。

我的问题是将一个功能与另一个功能联系起来。如果我裁剪图像,那么如果我改变亮度,我当前的代码会改变原始图像的亮度而不是裁剪图像。同样,首先我如果改变亮度,然后如果我裁剪,我的代码将裁剪原始图像而不是增亮图像。

下面的代码是改变亮度。

function slider2_Callback(hObject, eventdata, handles)
fname = getappdata(0, 'fname');
[a, map] = imread(fname);
x = ind2rgb(a, map);
b = get(handles.slider2,'value');
j = imadjust(x,[],[],b);
    axes(handles.axes1);
    imshow(j);

下面的代码是裁剪

function crop_Callback(hObject, eventdata, handles)
fname = getappdata(0, 'fname');
[a, map] = imread(fname);
x = ind2rgb(a, map);
new = imcrop(x);
axes(handles.axes1);
imshow(new);

假设首先说如果我裁剪图像,然后下一步如果我稍后在上面编辑的图像上进行一些其他操作更改裁剪图像的亮度,我如何将一个操作与另一个操作联系起来?

4

3 回答 3

1

我认为这是因为您在更改句柄后没有更新句柄,因此代码仍然指的是旧句柄。

guidata(hObject, handles);裁剪后立即尝试。

于 2013-08-05T19:01:59.517 回答
1

您需要为图像提供一个全局变量,而不是文件名的全局变量。因此,在您的每个回调中,您都可以操作您的图像,而无需每次都读取图像。此外,您应该在每次回调结束时保留您的更改setappdata。因此,您的回调将是这样的:

function changeimage_Callback(hObject, eventdata, handles)
image = getappdata(0, 'image');

% manipulation on image
% show image

setappdata(0, 'image', image);

如果你有一个 GUI,我认为如果你用handles. 也就是说,在您的 GUI 中加载您的图像并保持如下:

handles.image = imread(filename);
guidata(hObject, handles);

然后你的回调将是这样的:

function changeimage_Callback(hObject, eventdata, handles)

% manipulation on handles.image
% show handles.image

guidata(hObject, handles);
于 2013-08-05T19:36:19.863 回答
0

不要加载原始图像文件来执行您的操作,而是从图中加载图像。

换句话说,替换

fname = getappdata(0, 'fname');
[a, map] = imread(fname);
x = ind2rgb(a, map);

x = getimage(handles.axes1);

我没有测试代码,但它应该可以用最少的工作解决你的问题。

于 2013-08-05T19:18:53.437 回答