我创建了一个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
不可否认,我对功能的了解非常有限并且打电话给他们,但是我们将非常感谢任何帮助。
答案 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
来获取阈值。这纯粹是个人偏好,任何一种方法都可以正常使用。