MATLAB GUI TUTORIAL WITH IMAGE PROCESSING
#1
[IMG]files/2016/06/09/matalb43.jpg[/IMG]
Καλησπέρα σε όλους. Ασχολούμε λίγο καιρό τώρα με ένα Project για επεξεργασία εικόνας Real Time σε έναν DSP της TI και την αλληλεπίδραση με ένα GUI (Graphical User Interface) σε περιβάλλον Matlab (Matrix Laboratory).
Θα ήθελα να δημιουργήσω αυτό το thread για να βοηθήσω όποιον θέλει να κάνει μια αρχή σε δημιουργία GUI στο Matlab αλλά δεν βρίσκει κάτι στο Διαδίκτυο για να συνεισφέρω και εγώ όσο μπορώ στην κοινότητα, μιας και είμαι της λογικής της αλληλοβοήθειας.
Η δικιά μου επεξεργσία εικόνας που τραβάει ο αισθητήρας κάθε φορά γίνεται σε γλώσσα C μιας και "κατεβαίνει" στον DSP. Εδώ επειδή το όλο θέμα θα είναι εικονικό χρησιμοποιείται η κάθε επεξεργασία κατευθείαν μέσα στις συναρτήσεις του Matlab. Να πω πως έχει χρησιμοποιηθεί η έκδοση Matlab 7.8.0(R2009a):
Αρχικά, δημιουργούμε το .fig αρχείο στο Matlab πατώντας στο Command Window την εντολή <guide>.
Μόλις εμφανιστεί το παράθυρο επιλογών, ανοίγουμε ένα έτοιμο GUI (εάν έχουμε κάποιο έτοιμο) ή δημιουργούμε ένα από την αρχή πατώντας Create Blank Gui. Στη συνέχεια, εμφανίζεται ένα κενό .fig αρχείο στο οποίο θα δημιουργήσουμε το Γραφικό περιβάλλον αλληλεπίδρασής μας.

Το Matlab μας δίνει τη δυνατότητα στην αριστερή μπάρα με την λογική του drag n' drop να δημιουργήσουμε push buttons, radio buttons, toggle buttons, check boxes, sliders, axes, list boxes, pop-up menus κ.ά.
Στην δική μας περίπτωση θα χρειαστούμε τόσα push buttons όσα και οι επεξεργασίες που θέλουμε να πραγματοποιήσουμε στην εικόνα μας.
Το GUI που ανέπτυξα πιο πολύ για demonstration έχει τα παρακάτω push buttons

1) Load Image: φορτώνει μία εικόνα της οποίας το όνομα δίνεται από το command window από τον χρήστη,
2) Binarize Image: μετατρέπει την προηγούμενη εικόνα σε δυαδική,
3) Sobel: πραγματοποιεί ανίχνευση ακμών με την μέθοδο παραθύρου Sobel 3x3,
4) Negative: πραγματοποεί αντιστροφή στα χρώματα της εικόνας η οποία φορτώθηκε με το push button <Load Image>,
5) Save Original Image: για την αποθήκευση της αρχικής εικόνας που φορτώνεται,
6) Save Processed Image: για την αποθήκευση της επεξεργασμένης εικόνας.

Η εμφάνιση των εικόνων γίνεται με δύο axes (γραφικές παραστάσεις). Στο 1ο φαίνεται η εικόνα που φορτώνεται μέσω του push button <Load Image>. Στο 2ο φαίνεται η επεξεργασμένη εικόνα ανάλογα με την επεξεργασία.

Επίσης, το GUI περιέχει και έναν slider που όταν είναι στην τιμή 1 εμφανίζει στο αριστερό παράθυρο το ιστόγραμμα της αρχικής εικόνας, αλλιώς εμφανίζει το ιστόγραμμα της επεξεργασμένης εικόνας.

Όταν αποθηκεύσουμε το .fig αρχείο, το Matlab αυτόματα δημιουργεί ένα .m αρχείο με το ίδιο όνομα όπως αυτό του .fig αρχείο που αποθηκεύσαμε νωρίτερα.
Στο .m αρχείο που δημιουργεί το Matlab δημιουργούνται διάφορες συναρτήσεις. Αυτές οι οποίες μας ενδιαφέρουν σε πρώτο πλάνο είναι η <GUI_TEST>OpeningFcn στην οποία δημιουργείται η δομή <handles> η οποία περιέχει όλες τις πληροφορίες που θα χρησιμοποιήσουμε στις Callback συναρτήσεις στην συνέχεια του <GUI_TEST>.m αρχείου.

Ανάλογα με τον αριθμό των επεξεργασιών που θα φτιάξουμε στο .fig αρχείο, το Matlab αυτόματα θα δημιουργήσει τις αντίστοιχες Callback συναρτήσεις.
Πιο αναλυτικά, έστω ότι δημιουργούμε ένα push button στο .fig αρχείο, στου οποίου τα Properties ορίζουμε το δικό του Tag (ετικέτα) να έχει το όνομα Negative_Effect. Αυτόματα το Matlab θα δημιουργήσει μία Callback συνάρτηση (με όνομα Negative_Effect Callback) στην οποία εμείς καλούμαστε να προγραμματίσουμε την αντίστοιχη λειτουργεία του συγκεκριμένου push button κάθε φορά που θα το πατάμε.

Επίσης, εκτός των push buttons και των axes για την εμφάνιση των εικόνων έχω προσθέσει και δύο static texts πάνω από τα δύο axes. Τα static texts δεν κάνουν κάτι, όπως για παράδειγμα τα push buttons, οπότε χρησιμοποιούνται μόνο για να φαίνεται κάποια πληροφορία κάπου στο GUI μας.

Κώδικας:
function varargout = iconic_processing_diman77(varargin)
% ICONIC_PROCESSING_DIMAN77 M-file for iconic_processing_diman77.fig
%      ICONIC_PROCESSING_DIMAN77, by itself, creates a new ICONIC_PROCESSING_DIMAN77 or raises the existing
%      singleton*.
%
%      H = ICONIC_PROCESSING_DIMAN77 returns the handle to a new ICONIC_PROCESSING_DIMAN77 or the handle to
%      the existing singleton*.
%
%      ICONIC_PROCESSING_DIMAN77('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in ICONIC_PROCESSING_DIMAN77.M with the given input arguments.
%
%      ICONIC_PROCESSING_DIMAN77('Property','Value',...) creates a new ICONIC_PROCESSING_DIMAN77 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before iconic_processing_diman77_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to iconic_processing_diman77_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help iconic_processing_diman77

% Last Modified by GUIDE v2.5 01-Oct-2016 10:48:56

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',      mfilename, ...
                  'gui_Singleton',  gui_Singleton, ...
                  'gui_OpeningFcn', @iconic_processing_diman77_OpeningFcn, ...
                  'gui_OutputFcn',  @iconic_processing_diman77_OutputFcn, ...
                  'gui_LayoutFcn',  [] , ...
                  'gui_Callback',  []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before iconic_processing_diman77 is made visible.
function iconic_processing_diman77_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin  command line arguments to iconic_processing_diman77 (see VARARGIN)

% Choose default command line output for iconic_processing_diman77
handles.output = hObject;

handles.orig_image = [];    % default original image initialization
handles.proc_image = [];    % default processed image initialization

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes iconic_processing_diman77 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = iconic_processing_diman77_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in Load_Image.
function Load_Image_Callback(hObject, eventdata, handles)
% hObject    handle to Load_Image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
im = input('Enter your image name: ');
handles.orig_image = imread(im);
axes(handles.original_image);
imshow(handles.orig_image);
guidata(hObject, handles);

% --- Executes on button press in Binarize_Image.
function Binarize_Image_Callback(hObject, eventdata, handles)
% hObject    handle to Binarize_Image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
orig_image = handles.orig_image(:,:,1);
[m,n] = size(orig_image);
bin_image = zeros(m,n);
Thresh = mean(mean(orig_image));
for i=1:m
    for j=1:n
        if(orig_image(i,j)>Thresh)
            bin_image(i,j) = 0;
        else
            bin_image(i,j) = 1;
        end
    end
end
handles.proc_image = bin_image; %for save button use ...
axes(handles.processed_image);
imshow(bin_image); title('Binarized Image');
guidata(hObject, handles);


% --- Executes on button press in Sobel.
function Sobel_Callback(hObject, eventdata, handles)
% hObject    handle to Sobel (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
img = handles.orig_image(:,:,1);
img = im2double(img);
[m,n,z] = size(img);
out = zeros(m,n);
    for i=2:m-1
        for j=2:n-1
            Gx = (img(i+1,j-1)+2*img(i+1,j)+img(i+1,j+1))-(img(i-1,j-1)+2*img(i-1,j)+img(i-1,j+1));
            Gy = (img(i-1,j+1)+2*img(i,j+1)+img(i+1,j+1))-(img(i-1,j-1)+2*img(i,j-1)+img(i+1,j-1));
            G  = sqrt(Gx.^2+Gy.^2);
            %G = (abs(Gx)+abs(Gy))/2;
            out(i,j) = G;
        end
    end
    thresh = mean(mean(out));
    for i=1:m
        for j=1:n
            if out(i,j)<thresh
                out(i,j)=thresh;
            else
                out(i,j)=out(i,j);
            end
        end
    end
handles.proc_image = out;
axes(handles.processed_image);
imshow(out); title('Sobel Edge Detection');
guidata(hObject, handles);

% --- Executes on button press in Save_Original_Image.
function Save_Original_Image_Callback(hObject, eventdata, handles)
% hObject    handle to Save_Original_Image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
imwrite(handles.orig_image, 'Original_Image.bmp');

% --- Executes on button press in Save_Processed_Image.
function Save_Processed_Image_Callback(hObject, eventdata, handles)
% hObject    handle to Save_Processed_Image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
imwrite(handles.proc_image, 'Processed_image.bmp');

% --- Executes on button press in Negative_Effect.
function Negative_Effect_Callback(hObject, eventdata, handles)
% hObject    handle to Negative_Effect (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
orig_im = handles.orig_image(:,:,1);
orig_im = im2double(orig_im);
[m,n] = size(orig_im);
negative_im = zeros(m,n);
for i=1:m
    for j=1:n
        negative_im(i,j) = 1 - orig_im(i,j);
    end
end
handles.proc_image = negative_im;
axes(handles.processed_image);
imshow(negative_im); title('Negative effect');
guidata(hObject, handles);


% --- Executes on slider movement.
function Histogram_Slider_Callback(hObject, eventdata, handles)
% hObject    handle to Histogram_Slider (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
choice = get(hObject, 'Value');
or_im = handles.orig_image;
proc_im = handles.proc_image;
if(choice==1)
    axes(handles.original_image);
    imhist(or_im(:,:,1));
else
    axes(handles.processed_image);
    imhist(proc_im);
end
guidata(hObject,handles);
% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider


% --- Executes during object creation, after setting all properties.
function Histogram_Slider_CreateFcn(hObject, eventdata, handles)
% hObject    handle to Histogram_Slider (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

Ελπίζω να βοήθησα όποιον ενδιαφέρεται για την δημιουργία ενός απλού αρχικά GUI σε περιβάλλον Matlab. Κάποιες διευκρινήσεις για αρχάριους χρήστες Matlab:
1) Οταν εμφανιστεί στο command window το prompt <Enter your image name> , πατάμε το όνομα της εικόνας μας με την επέκτασή της, π.χ. αν την εικόνα μας την λένε MY_IMAGE.bmp, πατάμε 'MY_IMAGE.bmp' (εννοείται μέσα σε ' ' ). Απαραίτητη προυπόθεση είναι να έχουμε κάποια εικόνα στο τρέχων directory που βρισκόμαστε.
2) Όταν έχουμε αποθηκεύσει το .fig αρχείο μας και το Matlab δημιουργήσει το .m αρχείο με όλες τις συναρτήσεις, τότε σε περίπτωση που ο χρήστης θέλει να προσθέσει για παράδειγμα ένα push button ή να αλλάξει το Tag ενός ήδη υπάρχοντος push button, πρέπει να κάνει τις αλλαγές που απαιτούνται στο .m αρχεί χειροκίνητα! Ίσως και η μόνη αδυναμία δημιουργίας GUI σε περιβάλλον MatLab.

Αρχικά το κενό GUI χωρίς το πάτημα κάποιου push button :
https://f80i.imgup.net/GUI_Blankf693.PNG

Στη συνέχεια, αριστερά η αρχική εικόνα όταν πατάμε το Load Image Push Button και δεξιά ένα Sobel Edge Detection στην αριστερή εικόνα:
https://k67i.imgup.net/sobelf2d1.PNG

Τέλος, εφαρμογή του slider για εμφάνιση των ιστογραμμάτων :
https://j56i.imgup.net/Histograms42ba.PNG
  Απάντηση
#2
Θα ήθελα να προσθέσω κάποιες εικόνες λειτουργίας του GUI, αλλά για κάποιο λόγο δεν μπορώ να ανεβάσω εικόνες. Αν μπορείτε κατατοπείστε με όσον αφορά αυτό το θέμα, μιας και είμαι νέο μέλος στην κοινότητα.
  Απάντηση
#3
diman91, post: 24614, member: 1896 είπε κι ελάλησε:Θα ήθελα να προσθέσω κάποιες εικόνες λειτουργίας του GUI, αλλά για κάποιο λόγο δεν μπορώ να ανεβάσω εικόνες. Αν μπορείτε κατατοπείστε με όσον αφορά αυτό το θέμα, μιας και είμαι νέο μέλος στην κοινότητα.
Είναι κάποιο bug που μας έχει βρει εδώ και καιρό και δεν μπορούμε να ανεβάσουμε εικόνες από το «Επισύναψη» που είναι κανονικά για ανέβασμα εικόνων.
Η λύση είναι να ανεβάσεις (upload) την εικόνα που θέλεις σε κάποιο site (υπάρχουν sites για ανέβασμα εικόνων) και μετά να δώσεις το λινκ της εικόνας (που ανέβασες εκεί) στο πεδίο που θα δεις αν κάνεις κλικ στο «κουμπάκι» εδώ στον έντιτορ - το οποίο αν ακουμπήσεις τον κέρσορά σου πάνω του, θα δεις να λέει «Insert/edit image». [Είναι το 4o κουμπάκι πριν από το τέλος, στην 2η σειρά της γραμμής εργαλείων - από κάτω, και λίγο προς τα δεξιά, από το κουμπάκι από το οποίο βάζουμε τα emots/φατσούλες.]
 Σοβαρότητα (λέμε τώρα…), διαφάνεια (ΤΩΡΑ!) και Ελεύθερη πρόσβαση σε όλα.
  Απάντηση
#4
diman91 : Πολύ ωραίο άρθρο! Ευχαριστώ
  Απάντηση
#5
Ανεβάζω και μια πιο χρηστική εκδοχή :

Για την ιστορία έχουμε :
1) Ένα push-button για το load της εικόνας μας,
2) Τρία list boxes: 1 για την επεξεργασία της εικόνας με τρεις επιλογές, 1 για την αποθήκευση της εικόνας (της RGB ή της επεξεργασμένης) και ένα για την επιλογή του ιστογράμματος που θα εμφανιστεί στο τρίτο παράθυρο κάτω δεξιά, στο axes3 και
3) 3 axes: 1 για την εικόνα που κάνουμε load, 1 για την επεξεργασμένη εικόνα και 1 για το ιστόγραμμα είτε της αρχικής εικόνας είτε της επεξεργασμένης εικόνας.

Κώδικας:
function varargout = image_proc_newTest(varargin)
% IMAGE_PROC_NEWTEST M-file for image_proc_newTest.fig
%      IMAGE_PROC_NEWTEST, by itself, creates a new IMAGE_PROC_NEWTEST or raises the existing
%      singleton*.
%
%      H = IMAGE_PROC_NEWTEST returns the handle to a new IMAGE_PROC_NEWTEST or the handle to
%      the existing singleton*.
%
%      IMAGE_PROC_NEWTEST('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in IMAGE_PROC_NEWTEST.M with the given input arguments.
%
%      IMAGE_PROC_NEWTEST('Property','Value',...) creates a new IMAGE_PROC_NEWTEST or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before image_proc_newTest_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to image_proc_newTest_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help image_proc_newTest

% Last Modified by GUIDE v2.5 03-Oct-2016 22:40:11

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',      mfilename, ...
                  'gui_Singleton',  gui_Singleton, ...
                  'gui_OpeningFcn', @image_proc_newTest_OpeningFcn, ...
                  'gui_OutputFcn',  @image_proc_newTest_OutputFcn, ...
                  'gui_LayoutFcn',  [] , ...
                  'gui_Callback',  []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before image_proc_newTest is made visible.
function image_proc_newTest_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin  command line arguments to image_proc_newTest (see VARARGIN)
handles.orig_image = [];
handles.proc_image = [];
% Choose default command line output for image_proc_newTest
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes image_proc_newTest wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = image_proc_newTest_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in Load_Image.
function Load_Image_Callback(hObject, eventdata, handles)
% hObject    handle to Load_Image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
im = input('Enter image name please: ');
handles.orig_image = imread(im);
axes(handles.axes1);
imshow(handles.orig_image); title('RGB Image');
guidata(hObject, handles);

% --- Executes on selection change in Operations_listbox.
function Operations_listbox_Callback(hObject, eventdata, handles)
% hObject    handle to Operations_listbox (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
operation = get(handles.Operations_listbox, 'Value');
switch operation
    case 1
        orig_im = im2double(handles.orig_image(:,:,1));
        [m,n]=size(orig_im);
        negative_im = zeros(m,n);
        for i=1:m
            for j=1:n
                negative_im(i,j) = 1-orig_im(i,j);
            end
        end
        handles.proc_image=negative_im;        %for save button
        axes(handles.axes2);
        imshow(negative_im); title('Negative Image');
        guidata(hObject, handles);
    case 2
        orig_im = im2double(handles.orig_image(:,:,1));
        [m,n]=size(orig_im);
        bin_im=zeros(m,n);
        thresh=mean(mean(orig_im));
        for i=1:m
            for j=1:n
                if orig_im(i,j)>thresh
                    bin_im(i,j)=0;
                else
                    bin_im(i,j)=thresh;
                end
            end
        end
        handles.proc_image=bin_im;      %for save button
        axes(handles.axes2);
        imshow(bin_im); title('Binarized Image');
        guidata(hObject, handles);
    case 3
        img = handles.orig_image(:,:,1);
        img = im2double(img);
        [m,n,z] = size(img);
        out = zeros(m,n);
        for i=2:m-1
            for j=2:n-1
                Gx = (img(i+1,j-1)+2*img(i+1,j)+img(i+1,j+1))-(img(i-1,j-1)+2*img(i-1,j)+img(i-1,j+1));
                Gy = (img(i-1,j+1)+2*img(i,j+1)+img(i+1,j+1))-(img(i-1,j-1)+2*img(i,j-1)+img(i+1,j-1));
                G  = sqrt(Gx.^2+Gy.^2);
                %G = (abs(Gx)+abs(Gy))/2;
                out(i,j) = G;
            end
        end
        thresh = mean(mean(out));
        for i=1:m
            for j=1:n
                if out(i,j)<thresh
                    out(i,j)=thresh;
                else
                    out(i,j)=out(i,j);
                end
            end
        end
        handles.proc_image=out;    %for save button
        axes(handles.axes2);
        imshow(out); title('Sobel Edge Detection');
        guidata(hObject, handles);
end
% Hints: contents = get(hObject,'String') returns Operations_listbox contents as cell array
%        contents{get(hObject,'Value')} returns selected item from Operations_listbox


% --- Executes during object creation, after setting all properties.
function Operations_listbox_CreateFcn(hObject, eventdata, handles)
% hObject    handle to Operations_listbox (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: listbox controls usually have a white background on Windows.
%      See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in Histogram_listbox.
function Histogram_listbox_Callback(hObject, eventdata, handles)
% hObject    handle to Histogram_listbox (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
hist_choice=get(handles.Histogram_listbox,'Value');
switch hist_choice
    case 1
        axes(handles.axes3);
        imhist(handles.orig_image(:,:,1));
        title('RGB Image Histogram');
        guidata(hObject,handles);
    case 2
        axes(handles.axes3);
        imhist(handles.proc_image); axis([.1 1 0 .5*10^5]);
        title('Processed Image Histogram');
        guidata(hObject, handles);
end
% Hints: contents = get(hObject,'String') returns Histogram_listbox contents as cell array
%        contents{get(hObject,'Value')} returns selected item from Histogram_listbox


% --- Executes during object creation, after setting all properties.
function Histogram_listbox_CreateFcn(hObject, eventdata, handles)
% hObject    handle to Histogram_listbox (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: listbox controls usually have a white background on Windows.
%      See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in Save_listbox.
function Save_listbox_Callback(hObject, eventdata, handles)
% hObject    handle to Save_listbox (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
save_choice=get(handles.Save_listbox, 'Value');
switch save_choice
    case 1
        im_name=input('Enter name for RGB image: ');
        imwrite(handles.orig_image, im_name);
        guidata(hObject,handles);
    case 2
        im_name=input('Enter name for processed image to save: ');
        imwrite(handles.proc_image, im_name);
        guidata(hObject, handles);
end

% Hints: contents = get(hObject,'String') returns Save_listbox contents as cell array
%        contents{get(hObject,'Value')} returns selected item from Save_listbox


% --- Executes during object creation, after setting all properties.
function Save_listbox_CreateFcn(hObject, eventdata, handles)
% hObject    handle to Save_listbox (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: listbox controls usually have a white background on Windows.
%      See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

Ορίστε και κάποες εικόνες :

https://d04i.imgup.net/Blank_GUI11bf.PNG

https://h66i.imgup.net/RGB_Sobelee6b.PNG

https://n45i.imgup.net/RGB_Sobel_f949.PNG
  Απάντηση


Ίσως Σχετικά Νήματα...
Νήμα Άτομο Απαντήσεις Βλεφαριάσματα Τελευταία Ανάρτηση
  Οδηγός Εγκατάστασης MatLab σε Ubuntu Based Διανομές diman91 0 1.230 07.02.2017 00:26
Τελευταία Ανάρτηση: diman91

Πάμε στο Forum:


Πλάσματα σουλατσάρουν στο νήμα: 1 Επισκέπτης(ες)