0

GUI に問題があります。私のオープニング関数では、img_new保存した画像になるように変数を定義しました。

私の GUI には 2 つの軸があり、1 つは元の画像を表示し、もう 1 つはフィルター処理された画像を表示します。4 つのラジオボタンがあるパネルに 4 つのフィルターがあります。それぞれのコードの最後には、img_new= ラジオボタン フィルターを介して作成された画像があります。

ここにいくつかのコードがあります:

% --- Executes when selected object is changed in uipanel3.
function uipanel3_SelectionChangeFcn(hObject, eventdata, handles)
handles.count = handles.count + 1;

% Change filter orientation depending on which radiobutton is chosen
switch get(eventdata.NewValue,'Tag')
    case 'hte'
        h_te = zeros(handles.rows, handles.colums);

        # code of the filter...

        axes(handles.axes2);
        imshow(h_te);

        handles.img_new = h_te;

    case 'hc'
        h_c = zeros(handles.rows, handles.colums);

        # code of the filter...


        axes(handles.axes2);
        imshow(h_c);

        handles.img_new = h_c;

    case 'vlr'
        v_lr = zeros(handles.rows, handles.colums);

        # code of the filter...


        axes(handles.axes2);
        imshow(v_lr);

        handles.img_new = v_lr;

    case 'vc'
        v_c = zeros(handles.rows, handles.colums);

        # code of the filter...

        axes(handles.axes2);
        imshow(v_c);

        handles.img_new = v_c;

end
guidata(hObject, handles)

そしてここにimwrite関数があります:

% --------------------------------------------------------------------
function save_img_ClickedCallback(hObject, ~, handles)
% writing the new image
imwrite(handles.img_new, strcat('filtered_image_', num2str(handles.count), '.png'));
guidata(hObject, handles)

axes1 画像を元の画像に取得し、それをaxes2(フィルタリングされた)にフィルタリングする関数は次のとおりです

% --- Executes on button press in img2.
function img2_Callback(hObject, ~, handles)
% Read image 2
img = imread('./coimbra_estadio.jpg');
handles.img_d = im2double(img);

% image size
size_img = size(handles.img_d);
handles.colums = size_img(2);
handles.rows = size_img(1);

if rem(handles.rows,2) == 0
    handles.row_0 = ((handles.rows/2)+1);
else
    handles.row_0 = ((handles.rows/2)+0.5);
end

if rem(handles.colums,2) == 0
    handles.colum_0 = ((handles.colums/2)+1);
else
    handles.colum_0 = ((handles.colums/2)+0.5);
end

axes(handles.axes1);
imshow(img);

% Generate eventdata to call the radiobuttons function
eventdata_new.EventName = 'SelectionChanged';
eventdata_new.OldValue = get(handles.uipanel3,'SelectedObject');
eventdata_new.NewValue = get(handles.uipanel3,'SelectedObject');

uipanel3_SelectionChangeFcn(handles.uipanel3, eventdata_new, handles);
guidata(hObject, handles)

ご覧のとおり、最後にパネル関数を呼び出すので、画像が読み込まれると自動的にフィルター処理され、axes2画像が変更されます。

問題は、save 関数を呼び出すと、古いファイルが保存されることimg_newです。

ラジオボタンを変更するimg_newと更新されますが、変更しないと更新されません。画像をロードすると、ラジオボタン機能のパネルが自動的に呼び出されるようにする必要があります。

4

1 に答える 1

2

問題は、guidata(hObject,handles);古いimg2_Callbackハンドル オブジェクトを最終的な GUI 状態として保存すると、 で行われた更新uipanel3_SelectionChangeFcnが失われることです。 oruipannel3_SelectionChangeFcnを入れて呼び出した後に手動でハンドルを更新する必要があります (guidata の更新ハンドルへの呼び出しを忘れた場合は、ヘルプを参照してください)、またはimg2_callback の最後の行を削除するだけです (コードが後で変更される場合、より安全なアプローチの後に処理します...handles = guidata(hObject,handles);handles=guidata(hObject);guidata(hObject,handles);uipannel3_SelectionChangeFcn

于 2012-12-29T18:50:08.300 に答える