在MATLAB

时间:2015-09-17 00:08:59

标签: matlab image-processing coordinates zooming ginput

我在MATLAB中使用ginput函数来使用光标来收集图像上的许多x,y坐标。我沿着图像跟踪某条路径并需要放大以获得精确的坐标,但在使用ginput时禁用了放大选项。有关如何解决这个问题的任何想法?

这是我正在使用的非常简单的代码。

A = imread('image1.tif');
B = imshow(A);
[x,y] = ginput; 
% at this point i scan the image and click many times, and
% ideally i would like to be able to zoom in and out of the image to better 
% aim the cursor and obtain precise xy coordinates

3 个答案:

答案 0 :(得分:5)

我认为这样做的方法是利用"按钮" ginput函数的输出,即

[x,y,b]=ginput;

b返回按下的鼠标按钮或键盘按键。选择你最喜欢的两个键(我的碰巧是&#34; [&#34;和#34;]&#34;,字符91和93)并修改一些放大/缩小代码来处理它们:< / p>

A = imread('image1.png');
B = imshow(A);
X = []; Y = [];
while 0<1
    [x,y,b] = ginput(1); 
    if isempty(b); 
        break;
    elseif b==91;
        ax = axis; width=ax(2)-ax(1); height=ax(4)-ax(3);
        axis([x-width/2 x+width/2 y-height/2 y+height/2]);
        zoom(1/2);
    elseif b==93;
        ax = axis; width=ax(2)-ax(1); height=ax(4)-ax(3);
        axis([x-width/2 x+width/2 y-height/2 y+height/2]);
        zoom(2);    
    else
        X=[X;x];
        Y=[Y;y];
    end;
end
[X Y]

(1)中的ginput(1)非常重要,因此您一次只能获得一次点击/按键。

输入键是默认的ginput中断键,返回空b,由第一个if语句处理。

如果按下了键91或93,我们分别缩小(zoom(1/2))或放大(zoom(2))。使用axis的情侣线将光标放在光标的中心,这很重要,因此您可以放大图像的特定部分。

否则,将光标坐标x,y添加到您的坐标集X,Y

答案 1 :(得分:3)

作为替代方法,您可以使用MATLAB的datacursormode对象,它不会阻止图窗口的缩放/平移。

一个小例子(假设R2014b或更新版本):

h.myfig = figure;
h.myax = axes;

plot(h.myax, 1:10);

% Initialize data cursor object
cursorobj = datacursormode(h.myfig);
cursorobj.SnapToDataVertex = 'on'; % Snap to our plotted data, on by default

while ~waitforbuttonpress 
    % waitforbuttonpress returns 0 with click, 1 with key press
    % Does not trigger on ctrl, shift, alt, caps lock, num lock, or scroll lock
    cursorobj.Enable = 'on'; % Turn on the data cursor, hold alt to select multiple points
end
cursorobj.Enable = 'off';

mypoints = getCursorInfo(cursorobj);

请注意,您可能需要在图窗口内单击以触发数据光标。

我在这里使用waitforbuttonpress来控制while循环。评论时,waitforbuttonpress返回0鼠标按键,1按键,但不是由 Ctrl Shift < / kbd>, Alt Caps Num ScrLk 键。单击时按住 Alt 可以选择多个点。

完成选择点后,点击任何触发waitforbuttonpress的键,然后通过调用getCursorInfo输出您的数据点,这将返回包含您的点数信息的数据结构。此数据结构包含2或3个字段,具体取决于绘制的内容。该结构将始终包含Target,它是包含数据点的图形对象的句柄,以及Position,它是指定光标的x,y,(和z)坐标的数组。如果您已经绘制了linelineseries对象,那么您还将拥有DataIndex,这是与最近数据点对应的数据数组的标量索引。

答案 2 :(得分:0)

还有一种方法是使用 enableDefaultInteractivity() 函数,它可以使用鼠标滚轮来放大和缩小:

enableDefaultInteractivity(gca);
[x, y, b] = ginput();

它适用于我的 Matlab 版本(9.9.0.1524771 (R2020b) Update 2,在 Linux Fedora 上)。