从for循环中调用Matlab滑块

时间:2015-12-17 06:07:05

标签: matlab function image-processing slider

我创建了一个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');

我的代码的简化版本如下:

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 个答案:

答案 0 :(得分:1)

您需要定义callback function。一种方法是在与GUI相同的*.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来获取阈值。这纯粹是个人偏好,任何一种方法都可以正常使用。