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

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

我能够做到这一点的唯一方法是在其中有0.1个暂停的“for循环”中运行一两分钟,而通过IMRECT选择和更改ROI却非常麻烦。

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

任何帮助将不胜感激!

最佳答案

通常,您应该为imrect分配一个回调。例如:

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

通过使用匿名函数,回调应获取其他参数,例如图像和第二个轴。

我写了一个可以满足您需求的小代码段。您应该添加边界检查,因为我没有打扰。当您移动矩形时,它将更新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

关于matlab - Matlab:使用IMRECT选择的ROI实时绘图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12408601/

10-12 16:30