2015-12-17 3 views
1

Я создал проект Matlab, где изображение считывается из файла, а затем преобразуется в двоичный файл с использованием предопределенного порогового значения. Этот цикл цикла повторяется для всей папки похожих изображений.Вызов ползунка Matlab из цикла for

Я пытаюсь реализовать слайдер, чтобы изменить пороговое значение в реальном времени с помощью ползунка, который, в свою очередь, отрегулирует двоичное изображение. У меня возникают проблемы с разработкой, где можно определить uicontrol слайдера, а также где/как вызвать ползунок из цикла.

У меня есть UIControl слайдера:

uicontrol(... 
     'tag', 'fff',... 
     'style', 'slider',... 
     'callback', @ui_slider_Callback,... 
     'position', [20 20 200 50],... 
     'tooltipstring', 'Colormap scaling relative to actual slice',... 
     'Max', 250,... 
     'Min', 0,... 
     'value', 230,... 
     'SliderStep', [0.002, 0.002]); 

Я также знаю, где мне нужно, чтобы иметь эту линию, но я не уверен, нужно ли я определить функцию слайдера:

thresholdValue = get(hObject,'Value'); 

A упрощенная версия моего кода:

function 

yourfolder=path name; 
d=dir([yourfolder '\*.jpg']); 
files={d.name}; 

for q=1:numel(files); 

    I = imread(files{q}); 

    J = rgb2gray(I); 

    thresholdValue = 230; 

    binaryImage = J < thresholdValue; 

    imshow(binaryImage); 

    drawnow; 

end 

end 

Понятно, что у меня очень ограниченные знания о функциях и призвать их, но любая помощь будет очень признательна.

ответ

1

Необходимо определить callback function. Один из способов - определить его в том же файле *.m, что и ваш графический интерфейс, который MATLAB вызывает local function.

Небольшой функциональный пример:

function testcode 
% Initialize GUI 
h.fig = figure('MenuBar', 'none', 'ToolBar', 'none'); 
h.ax = axes(... 
    'Parent', h.fig, ... 
    'Units', 'Normalized', ... 
    'Position', [0.1 0.15 0.8 0.8] ... 
    ); 
h.slide = uicontrol(... 
    'tag', 'fff', ... 
    'style', 'slider', ... 
    'Units', 'Normalized', ... 
    'position', [0.05 0.03 0.9 0.05], ... 
    'tooltipstring', 'Colormap scaling relative to actual slice', ... 
    'Max', 250, ... 
    'Min', 0, ... 
    'value', 230, ... 
    'SliderStep', [0.002, 0.002] ... 
    ); 

% Dummy image 
I = imread('ngc6543a.jpg'); 
h.img = rgb2gray(I); 
thresholdValue = get(h.slide, 'Value'); 
binaryImage = h.img < thresholdValue; 
imshow(binaryImage, 'Parent', h.ax); 

% Need to set callback after all our elements are initialized 
set(h.slide, 'Callback', {@ui_slider_Callback, h}); 

end 

function ui_slider_Callback(~, ~, h) 
    thresholdValue = get(h.slide, 'Value'); 
    binaryImage = h.img < thresholdValue; 
    imshow(binaryImage, 'Parent', h.ax); 
    drawnow 
end 

По умолчанию, обратные вызовы всегда передаются две переменные, дескриптор вызывающего объекта и eventdata структуру, содержание которого меняется. Как поясняется в документации обратного вызова, вы можете передать дополнительные входы для вашего обратного вызова путем переноса всего содержимого в массив ячеек. Следует отметить, что значение переменной, передаваемой обратному вызову, является значением, которое существует при определении обратного вызова. Из-за этого вы увидите, что я определил обратные вызовы после инициализации всех наших графических объектов.

Я использовал рукоятку ползунка явно, а не используя hObj, чтобы получить пороговое значение. Это чисто личное предпочтение, либо метод будет работать нормально.

+0

Отлично! Именно то, что я искал. Большое спасибо за Вашу помощь! – MSTTm

Смежные вопросы