【问题标题】:How can I draw several ROI's using imfreehand?如何使用 imfreehand 绘制多个 ROI?
【发布时间】:2016-06-08 00:56:57
【问题描述】:

我需要使用 MATLAB R2015a 中的 imfreehand 函数绘制多个 ROI。我需要的是绘制图像,用户必须选择他/她想要的尽可能多的 ROI,完成后,他们必须单击(鼠标右键)才能完成选择。此外,用户必须能够选择所需的 ROI 并将其删除。

这里的任何人都可以给我一些例子或任何关于我如何实现它的想法吗?

提前致谢,

【问题讨论】:

  • 你可以点击退出而不是右键来结束它吗?

标签: matlab matlab-figure matlab-guide


【解决方案1】:

您可以通过为坐标区设置 ButtonDownFcn 回调来做到这一点。每当用户单击鼠标左键时,您就允许他们开始绘制新的 ROI。当他们单击鼠标右键时,它会停止并返回imfreehand 对象的列表。当您右键单击 ROI 时,会有一个上下文菜单允许他们删除给定的 ROI。

function handles = multiROI()

    hax = axes('ButtonDownFcn', @(src,evnt)buttondown(evnt))

    handles = [];

    % Keep this function open until we right click
    waitfor(gca, 'UserData')

    function buttondown(evnt)
        switch evnt.Button
            case 1      
                % On a left click draw a new ROI
                handles = cat(1, handles, imfreehand());
            case 3
                % On a right click, remove empty ROIs and return
                handles = handles(isvalid(handles));
                set(gca, 'UserData', 'done')
        end
    end
end

更新

这是一个不需要多次点击但使用退出键完成绘图的版本。

handles = imfreehand();
lastroi = handles;

while ~isempty(lastroi)
    lastroi = imfreehand();
    handles = cat(1, handles, lastroi);
end

handles = handles(isvalid(handles));

【讨论】:

  • 谢谢!但是我尝试了您的代码,但似乎无法正常工作。当我点击图片并点击几下直到我可以画一些东西时,会有一种延迟......
  • @Gabs 是的,您必须单击激活imfreehand,然后再次单击并按住以绘制。
  • 有没有办法避免这么多点击?我的意思是,一旦我绘制了一个 ROI,GUI 就可以绘制另一个,而无需单击并按住?
  • @Gabs 您可以在while 循环中轻松调用imfreehand,但您将无法注册右键单击。这就是为什么我在您最初的帖子中评论询问您是否可以点击转义而不是右键单击的原因。此外,如果您在循环中执行此操作,您将无法删除现有的 ROI
  • @Gabs 我用这种方法的一个例子更新了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多