Matlab:使用IMRECT选择的ROI实时绘图
我有一个有两个轴的GUI。第一个轴具有低分辨率图像 我想做的是使用IMRECT在第一个轴上选择一个区域,然后在第二个轴上显示该区域作为高分辨率图像,同时随着IMRECT矩形的移动而不断更新 我能做到这一点的唯一方法是使用一个“for循环”,其中有一个0.1的暂停,在我用IMRECT选择和更改ROI时只运行一两分钟,非常麻烦 我的想法是使用鼠标在第一个轴内移动时运行的函数,该函数中包含绘图和getPosition命令。但是,我不知道如何编写这样的函数(鼠标在轴内移动时触发)Matlab:使用IMRECT选择的ROI实时绘图,matlab,plot,real-time,roi,Matlab,Plot,Real Time,Roi,我有一个有两个轴的GUI。第一个轴具有低分辨率图像 我想做的是使用IMRECT在第一个轴上选择一个区域,然后在第二个轴上显示该区域作为高分辨率图像,同时随着IMRECT矩形的移动而不断更新 我能做到这一点的唯一方法是使用一个“for循环”,其中有一个0.1的暂停,在我用IMRECT选择和更改ROI时只运行一两分钟,非常麻烦 我的想法是使用鼠标在第一个轴内移动时运行的函数,该函数中包含绘图和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
与@Andrey的回答类似,但有三个不同:
- 设置
限制,而不是轴
(哪一个可能更快?)'CData'
- 放大系数是可变的,并且取决于矩形大小,这是由于
'fit'
'iniitalmagnition'
- 添加了约束Tfcn
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]);
还有,谢谢你,安德烈。我让它工作得很好。之前我挣扎了一段时间,这正是我想要的。我之前的一行代码用于将imrect矩形约束在图像大小范围内,现在已经不起作用了。您是否有一个快速解决方案来将直接选择约束到轴内?多谢各位@用户1668909,退房。尤其是
makeConstraint
函数,我认为这是最好的答案。