0

MATLAB で 1 つのイメージ エディター ウィンドウを作成しました。これには、明るさ、コントラスト、トリミング、回転などのさまざまな操作が含まれています。この 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

I think it's because you are not updating your handles after changing them, hence the code is still referring to the old handle.

Try guidata(hObject, handles); right after cropping.

于 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が1つあれば、 でそういうことができるともっと便利だと思います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

元のイメージ ファイルを読み込んで操作を実行する代わりに、Figure からイメージを読み込みます。

つまり、置き換えます

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

x = getimage(handles.axes1);

私はコードをテストしませんでしたが、最小限の作業で問題を解決できるはずです。

于 2013-08-05T19:18:53.437 に答える