从for循环中调用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');

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

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

诚然,我对函数及其调用的了解非常有限,但如果能提供任何帮助,我将不胜感激。

您需要定义回调函数。一种方法是在与GUI相同的*.m文件中定义它,MATLAB称之为本地函数。

一个小的功能示例:

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来获取阈值。这纯粹是个人偏好,任何一种方法都可以。

最新更新