2011-05-16 74 views
2

我建立一个Matlab GUI,该GUI让用户使用一些交互式工具用于图像处理(不具有图文件中的单个M文件)的工具栏,
imrotate的图像的旋转和角参数和用bwareaopen和区域参数清除像素。matlab的GUI与M文件

起初,我想用我的M文件与somehthing绘制工具,如

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); 

,但那时,我发现工具栏的设计都为内置类FileExchange Fireworks和想,也许我错过以正确和简洁的方式设计我的工具栏的类和内置uitoolbar命令。

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

回答

1

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

我给出了一个简单的例子。一些注意事项:

  1. 切换按钮与按键的逻辑不自地反转图像,翻转,然后倒正确实施再不会给出正确的结果。但是,我只是试图展示如何编写工具栏按钮而不是如何处理图像。
  2. 你可能会想要使用更多的创意图标,然后我在CData属性中给出了。
  3. 尽管有我的程序示例,但我仍鼓励采用面向对象的方法来解决此问题。

这就是:

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