在 MATLAB GUI 中与 2 个图形同时交互

Posted

技术标签:

【中文标题】在 MATLAB GUI 中与 2 个图形同时交互【英文标题】:Simultaneous interaction with 2 figures in MATLAB GUI 【发布时间】:2015-03-13 06:50:26 【问题描述】:

我正在 MATLAB(指南)中编写一个 GUI,其中将向用户显示 2 个图像(两个图像在单个 gui 窗口中并排放置)来自一系列图像(但每个图像都有一点点漂移),并且将被允许选择感兴趣的区域。

我希望用户选择图像 1 中的工作区域,同时突出显示图像 2 中的选定区域,以便更容易判断感兴趣的特征是否已经偏离选定区域。该怎么做?

我正在使用以下答案来选择和裁剪感兴趣的区域(仅供参考): crop image with fixed x/y ratio

【问题讨论】:

【参考方案1】:

这是一种使用imrect 及其addNewPositionCallback 方法的方法。查看here 获取可用方法列表。

在下图中,我创建了 2 个轴。左边是原始图像,右边是“修改后的”图像。通过按下按钮,imrect 被调用,addNewPositionCallback 方法执行一个名为GetROIPosition 的函数,用于获取由imrect 定义的矩形的位置。同时,在第 2 轴上绘制一个与第 1 轴位置相同的矩形。为了更加花哨,您可以使用setConstrainedPosition 强制将矩形包含在给定的轴中。我会让你做的:) 这是带有 2 个屏幕截图的完整代码:

function SelectROIs(~)
%clc
clear
close all

%//=========================
%// Create GUI components

hfigure = figure('Position',[300 300 900 600],'Units','Pixels');

handles.axesIm1 = axes('Units','Pixels','Position',[30,100,400 400],'XTick',[],'YTIck',[]);
handles.axesIm2 = axes('Units','Pixels','Position',[460,100,400,400],'XTick',[],'YTIck',[]);

handles.TextaxesIm1 = uicontrol('Style','Text','Position',[190 480 110 20],'String','Original image','FontSize',14);
handles.TextaxesIm2 = uicontrol('Style','Text','Position',[620 480 110 20],'String','Modified image','FontSize',14);

%// Create pushbutton and its callback
handles.SelectROIColoring_pushbutton = uicontrol('Style','pushbutton','Position',[380 500 120 30],'String','Select ROI','FontSize',14,'Callback',@(s,e) SelectROIListCallback);

%// ================================
%/ Read image and create 2nd image by taking median filter
handles.Im = imread('coins.png');

[Height,Width,~] = size(handles.Im);
handles.ModifIm = medfilt2(handles.Im,[3 3]);

imshow(handles.Im,'InitialMagnification','fit','parent',handles.axesIm1);
imshow(handles.ModifIm,'InitialMagnification','fit','parent',handles.axesIm2);


guidata(hfigure,handles);
%%
%// Pushbutton's callback. Create a draggable rectangle in the 1st axes and
%a rectangle in the 2nd axes. Using the addNewPositionCallback method of
%imrect, you can get the position in real time and update that of the
%rectangle.

    function SelectROIListCallback(~)

        hfindROI = findobj(handles.axesIm1,'Type','imrect');
        delete(hfindROI);

        hROI = imrect(handles.axesIm1,[Width/4  Height/4 Width/2 Height/2]); % Arbitrary size for initial centered ROI.

        axes(handles.axesIm2)
        rectangle('Position',[Width/4  Height/4 Width/2 Height/2],'EdgeColor','y','LineWidth',2);

        id = addNewPositionCallback(hROI,@(s,e) GetROIPosition(hROI));

    end

%// Function to fetch current position of the moving rectangle.
    function ROIPos = GetROIPosition(hROI)

        ROIPos = round(getPosition(hROI));

        axes(handles.axesIm2)

        hRect = findobj('Type','rectangle');
        delete(hRect)
        rectangle('Position',ROIPos,'EdgeColor','y','LineWidth',2);
    end

end

按下按钮后的图:

移动矩形后:

耶!希望有帮助!请注意,由于您使用的是 GUIDE,因此回调的语法看起来会有些不同,但想法完全相同。

【讨论】:

成功了!!!!!!完全奏效!想知道为什么 addNewPositionCallback() 的文档记录如此糟糕。即使搜索 google 也不会链接到任何 Matlab 文档,而是链接到 matlab 中心中的一些问题。只是一个简单的问题,定义这样的函数意味着什么 - someRandomFunction(~)?我的意思是'〜'是什么意思? 太棒了!是的,我同意有关该文档的文档并没有真正提供:) 至于您的问题,这意味着该函数没有任何输入参数。你可以省略它,但这样写是一种习惯哈哈。 啊!无论如何,回到编码!非常感谢! 不客气!我不久前遇到了这个确切的问题,所以我只是稍微修改了我的代码:) 玩得开心!

以上是关于在 MATLAB GUI 中与 2 个图形同时交互的主要内容,如果未能解决你的问题,请参考以下文章

如何使用matlab制作GUI界面

语音分析基于matlab GUI语音信号分析含Matlab源码 1718期

Matlab GUI 中怎么清空axes中的图形

怎么用matlab实现计算器功能

matlab gui 是干啥的?

MATLAB 使用GUI设计简单的计算器