MATLAB - 如何放大鼠标位置

时间:2014-09-19 15:22:25

标签: matlab zoom mouse ginput

当我离开/右键单击图像上的某个点但是我不想使用放大镜时,我想要放大/缩小图像。基本上,我需要一个脚本,我上面说的。我已经提出了以下脚本,但它只放大/缩小到中心而不是我点击的位置。

如果你问为什么我使用ginput得到点击的位置答案是,我打算用这个脚本来编辑二进制图像!我删除了与二进制图像编辑部分对应的行,以避免混淆。

hFi= figure; imshow(e);

button=0;

while button~=2
    % Get the mouse position on the axes (needed for binary image editing) and button number
    [y,x,button]=ginput(1);

    % Get the mouse position on the figure
    position=get(hFi,'CurrentPoint')

    % Set 'CurrentPoint' to the mouse position that was just captured
    set(hFi,'CurrentPoint',position)

    % Determine if it is a zoom-in or zoom-out
    if button==1
        zoom(2);
    elseif button==3
        zoom(0.5);
    end

end

我认为命令set()在这里没有做任何事情,但我看到有人在论坛中提出建议。对不起,如果看起来很蠢!

2 个答案:

答案 0 :(得分:0)

我假设你有一个矩阵,因为你要求y和x值。 通过这种方式,一个简单的答案就是显示更小或更大范围的值。

让A成为你的矩阵。

    A=rand(1000,1000);
figure,
h=imagesc(A)
axis off
axis image
colormap('gray')
A_range=size(A);
A_zoom=1;
while true

    [y,x,button]=ginput(1)

    A_center=[x,y];

    if button==1
        A_zoom=A_zoom/2;
    elseif button==3
        A_zoom=A_zoom*2;
    end

    axis([max(x-A_range(1)*A_zoom,1), min(x+A_range(1)*A_zoom,A_range(1)), ...
        max(y-A_range(2)*A_zoom,1), min(y+A_range(2)*A_zoom,A_range(2))])
end

答案 1 :(得分:0)

好吧,在玩了imshow并阅读互联网上的文档之后,我终于找到了我一直在寻找的东西。感谢所有提出一些想法的人,尤其是ASantosRibeiro,他给了我改变轴限制的想法。

基本上,我使用了zoomxlim / ylim命令的组合。因此,最终代码如下:

hFi= figure; h=imshow(e);

button=0;
zlvl=1;
xl = get(gca,'xlim');
xlen = size(e,2);
yl = get(gca,'ylim');
ylen = size(e,1);

while button~=2
    % Get the mouse position on the axes (needed for binary image editing) and button number
    [y,x,button]=ginput(1);

    % Determine if it is a zoom-in or zoom-out
    if button==1
        zlvl = zlvl*2;
        zoom(2);
    elseif button==3
        zlvl = zlvl/2;
        if zlvl<1, zlvl=1; end % No zoom level smaller than 1
        zoom(0.5);
    end

    % Change the axis limits to where the mouse click has occurred
    % and make sure that the display window is within the image dimensions
    xlimit = [x-xlen/zlvl/2+0.5 x+xlen/zlvl/2+0.5];
    if xlimit(1)<0.5, xlimit=[0.5 xlen/zlvl+0.5]; end
    if xlimit(2)>0.5+xlen, xlimit=[xlen-xlen/zlvl+0.5 xlen+0.5]; end
    xlim(xlimit);

    ylimit = [y-ylen/zlvl/2+0.5 y+ylen/zlvl/2+0.5];
    if ylimit(1)<=0.5, ylimit=[0.5 ylen/zlvl+0.5]; end
    if ylimit(2)>=0.5+ylen, ylimit=[ylen-ylen/zlvl+0.5 ylen+0.5]; end
    ylim(ylimit);
end

此代码可让您在使用ginput时放大/缩小,并且需要使用imshow来保持图像的宽高比固定。当您需要读取图像像素的坐标并放大/缩小时,这将变得非常有用。当用户左键单击时,它会放大,当用户左键单击时,它会缩小。如果单击中间按钮,则while循环结束。可以添加其他按钮以执行所需的操作。例如,我添加了几行代码来编辑二进制图像。

我想知道您的想法,以及是否有任何方法可以使此代码更有效。