0

I have a problem in my GUI. In my opening function I defined an img_new variable to be an image I have stored.

My GUI has two axes, one displays the original image and the other one the filtered one. I have 4 filters in a panel with the 4 radiobuttons. And in the end of each one's code there's the img_new = the image created through the radiobutton filter.

Here's some code:

% --- 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)

and here's the imwrite function:

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

Here's the function to get the image to axes1 the original) and filter it to axes2 (filtered)

% --- 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)

As you can see, in the end I call the panel function so when the image is loaded it is automatically filtered and the axes2 image changes.

The problem is when I call the save function it saves the old img_new.

If I change the radiobutton the img_new is refreshed, but if it is not changed it is not refreshed. It should be as loading an image automatically calls for the panel of radiobuttons function.

SamuelNLP
  • 4,038
  • 9
  • 59
  • 102

1 Answers1

2

The problem is that guidata(hObject,handles); at the end of img2_Callback saves old handles object as a final gui state, updates made in uipanel3_SelectionChangeFcn are lost. You need to eitehr manually update handles after calling uipannel3_SelectionChangeFcn by putting handles = guidata(hObject,handles); or handles=guidata(hObject); (forgot which call to guidata updates handles, please see help for that), or simply remove the line guidata(hObject,handles); at the end of img2_callback (less safe if code is going to change later, updating handles after uipannel3_SelectionChangeFcn is safer approach...

Ilya Kobelevskiy
  • 5,245
  • 4
  • 24
  • 41