我在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
答案 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)坐标的数组。如果您已经绘制了line
或lineseries
对象,那么您还将拥有DataIndex
,这是与最近数据点对应的数据数组的标量索引。
答案 2 :(得分:0)
还有一种方法是使用 enableDefaultInteractivity() 函数,它可以使用鼠标滚轮来放大和缩小:
enableDefaultInteractivity(gca);
[x, y, b] = ginput();
它适用于我的 Matlab 版本(9.9.0.1524771 (R2020b) Update 2,在 Linux Fedora 上)。