我有两个轴的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/