3

我正在使用ginputMATLAB 中的函数来使用光标来收集图像上的许多 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
4

3 回答 3

6

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

[x,y,b]=ginput;

b返回被按下的鼠标按钮或键盘键。选择您最喜欢的两个键(例如 [ 和 ],字符 91 和 93)并编写一些放大/缩小代码来处理按下这些键时发生的情况:

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)因此您一次只能获得一次单击/按键。

enter 键是默认的ginputbreak 键,它返回一个空的b,并由第一条if语句处理。

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

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

于 2015-09-17T01:05:21.777 回答
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按键,但不是由CtrlShiftAltCapsNumScrLk键触发。您可以在单击的同时按住选择多个点Alt

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

于 2015-09-17T12:42:14.400 回答
0

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

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

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

于 2021-01-11T14:16:10.967 回答