mfile中带工具栏的MatlabGUI

mfile中带工具栏的MatlabGUI,matlab,toolbar,Matlab,Toolbar,我正在构建一个MatlabGUI,它允许用户使用一些交互式工具进行图像处理(一个没有fig文件的mfile), 类似于使用imrotate和角度参数旋转图像,以及使用bwareaopen和区域参数清除像素 起初,我想用我的mfile绘制工具,比如 function myGUI( grayI ) h_fig = figure; h_ax = imshow( grayI ); title('Drag line and press button to rotate image'); ImgSize

我正在构建一个MatlabGUI,它允许用户使用一些交互式工具进行图像处理(一个没有fig文件的mfile),
类似于使用
imrotate
和角度参数旋转图像,以及使用
bwareaopen
和区域参数清除像素

起初,我想用我的mfile绘制工具,比如

function myGUI( grayI )

h_fig = figure;
h_ax = imshow( grayI );
title('Drag line and press button to rotate image');

ImgSize = size(grayI);
h_lev = imline(gca, [ 0.2*ImgSize(2), 0.1*ImgSize(1); ...
0.8*ImgSize(2) 0.1*ImgSize(1) ] );
h_lev.addNewPositionCallback( @LineUpdateFcn );

% text for the angle
h_txt = uicontrol('Style','text','String','Angle = []', 'unit', 'norm', ...
'pos',[0 0.9 .1 .05]);

%add rotate button
h_btn = uicontrol('unit','norm','pos',[0 0.95 .1 .05]);
set(h_btn,'string','Rotate','callback',@RotateImageWithLever);

% save the elements data in figure
setappdata(h_fig,'h_lev',h_lev);
setappdata(h_fig,'h_ax',h_ax);
setappdata(h_fig,'h_txt',h_txt);

% wait for user to close figure
waitfor( h_fig );
但后来,我在中遇到了工具栏作为内置类的设计,并认为可能我缺少了使用类和内置
uitoolbar
命令设计工具栏的正确而简洁的方法


关于从单个mfile设计我的工具栏的任何建议?

对于您描述的工具,使用自定义工具栏可能是一个很好的解决方案。分别使用和创建工具栏和添加按钮或切换按钮。这可以在GUI m文件的初始化阶段轻松完成

下面我给出了一个简单的例子。一些警告:

  • 切换按钮与按钮的逻辑未正确实现,因为反转图像、翻转图像然后再次反转将不会给出正确的结果。然而,我只是想展示如何对工具栏按钮进行编码,而不是如何处理图像
  • 您可能希望使用比我在CData属性中提供的更具创造性的图标
  • 尽管有我的过程示例,我还是鼓励使用面向对象的方法来解决这个问题
  • 这是:

    function myGUI(grayI)
    
    persistent grayICopy;
    
    %# Keep a persistent copy of the image data to be used in the toolbar tool
    %# callbacks. Other possibilities here are to not store this data
    %# persistently and instead read it from the plotted values or restructure
    %# this whole code as a class and store the raw image data in a class
    %# property.
    grayICopy = grayI;
    
    %# Create the figure window and show the image.
    hFigure = figure;
    hAxes = axes('Parent', hFigure);
    image(grayI, 'Parent', hAxes); %# I don't have the Image processing Toolbox
    
    %# Create toolbar
    hToolbar = uitoolbar('Parent', hFigure);
    
    %# Add a toolbar button for 90deg clockwise rotation
    uipushtool('Parent', hToolbar, ...
        'ClickedCallback', @flipVertical, ...
        'CData', ...
        repmat([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
        0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0; ...
        0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], [1 1 3]));
    
    %# Add a toolbar toggle button for inverting image
    uitoggletool('Parent', hToolbar, ...
        'OnCallback', @toggleInverseOn, ...
        'OffCallback', @toggleInverseOff, ...
        'CData', ...
        repmat([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; ...
        0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
        0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
        0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
        0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], [1 1 3]));
    
        function flipVertical(src, eventdata)
            grayICopy = flipdim(grayICopy, 1);
            image(grayICopy, 'Parent', hAxes);
        end
    
        function toggleInverseOn(src, eventdata)
            image(1-grayICopy, 'Parent', hAxes);
        end
    
        function toggleInverseOff(src, eventdata)
            image(grayICopy, 'Parent', hAxes);
        end
    end