【问题标题】:Matlab: Real-time plotting of ROI selected with IMRECTMatlab:使用 IMRECT 选择的 ROI 的实时绘图
【发布时间】:2012-09-13 14:28:50
【问题描述】:

我有一个带有两个轴的 GUI。第一个轴具有低分辨率图像。

我想做的是使用 IMRECT 在第一个轴上选择一个区域,然后将该区域显示为第二个轴上的高分辨率图像,同时在我移动 IMRECT 矩形时不断更新。

我能够做到这一点的唯一方法是使用带有 0.1 暂停的“for 循环”,在我选择并使用 IMRECT 更改 ROI 时只运行一两分钟,非常麻烦。

我的想法是使用一个在鼠标在第一个轴内移动时运行的函数,并在该函数中使用 ploting 和 getPosition 命令。但是,我不确定如何编写这样的函数(触发轴内的鼠标移动)。

任何帮助将不胜感激!

【问题讨论】:

标签: matlab plot real-time roi


【解决方案1】:

一般来说,您应该为您的imrect 分配一个回调。例如:

x = imrect();
x.addNewPositionCallback( @(x)(disp('The rect has changed')))

回调应该通过匿名函数获取额外的参数,例如图像和第二个轴。


我写了一个小代码 sn-p 来做你想做的事。您应该添加边界检查,因为我没有打扰。当您移动矩形时,它会更新CData 而不是运行imshow,因此非常平滑。

function Zoomer
    figure();

    highResImage = imread('peppers.png');
    lowResImage = imresize(highResImage,0.5);

    a1 = subplot(2,1,1);
    a2 = subplot(2,1,2);

    imshow(lowResImage,'Parent',a1);
    initialPosition = [10 10 100 100];
    lowResRect = imrect(a1,initialPosition);

    lowResRect.addNewPositionCallback( @(pos)Callback(pos,a2,highResImage));

    Callback( initialPosition , a2, highResImage);
end

function Callback(position,axesHandle, highResImage)
    position = position * 2;
    x1 = position(1);
    y1 = position(2);
    x2 = position(1) + position(3);
    y2 = position(2) + position(4);

    highResThumbnail = highResImage( round(y1:y2),round(x1:x2),:);

    if isempty( get(axesHandle,'Children')) 
        imshow(highResThumbnail,'Parent',axesHandle);   
    else
        imHandle = get(axesHandle,'Children');
        oldSize = size(get(imHandle,'CData'));
        if ~isequal(oldSize, size(highResThumbnail))
            imshow(highResThumbnail,'Parent',axesHandle);
        else
            set( imHandle,'CData', highResThumbnail);
        end     
    end
end

【讨论】:

  • 谢谢,安德烈。我让它完美地工作。之前挣扎了一段时间,这正是我想要的。我用于将 imrect 矩形限制在图像大小范围内的前一行代码现在不再有效。您是否有快速解决方案将不正确的选择限制在轴内?非常感谢!
  • @user1668909,查看stackoverflow.com/questions/10998739/…。尤其是makeConstraint函数
【解决方案2】:

与@Andrey 的回复类似的功能,但有三个不同之处:

  • 设置axis 限制而不是'CData'(可能更快?)
  • 由于'fit' 'IniitalMagnification'放大系数是可变的,取决于矩形大小。
  • 添加了 ConstraintFcn

应该是:

function imZ = Zoom(im, s)

f = figure;
a1 = subplot(1,2,1);
imshow(im,'InitialMagnification', 'fit');
a2 = subplot(1,2,2);
imshow(im,'InitialMagnification', 'fit');

Ipos = [0 0 s];
rect = imrect(a1,Ipos);
rect.setPositionConstraintFcn(@(p) Const(p,size(im)));
rect.addNewPositionCallback(@(p) CB(p,a2));
CB(Ipos,a2);

if nargout > 0
    uiwait(f);
    imZ = im(pm(2):pm(2)+pm(4),pm(1):pm(1)+pm(3),:);
end

    function p = Const(p,imS)
        p(1:2) = max(1,p(1:2));
        p(1:2) = min(imS([2 1])-p(3:4),p(1:2));
    end

    function CB(p,a)
        pm = round(p);
        axes(a);       
        axis([pm(1),pm(1)+pm(3),pm(2),pm(2)+pm(4)]);
    end
end

可以这样称呼:

Zoom(imread('peppers.png'),[100 100]);

【讨论】:

  • 我认为这是最好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多