一些涉及到数据处理的GUI界面,为了加强用户交互的功能,往往需要能够在图像上取点并对获取的坐标进行处理。今天做了个例子,简要介绍一下三种获取图像坐标的方法。
一、matlab工具栏中自带的数据游标功能。
matlab工具栏中的数据游标功能可以读取数据图中的数据,并且在图中显示出横纵坐标。在OpeningFcn函数中加入一句set(hObject,'toolbar','figure');就可以打开图像界面的工具栏。
或者在fig界面中双击背景,进入figure的属性编辑器,找到toolbar选项将其选择成‘figure’即可。
利用工具栏中自带的数据游标功能很简单方便,但是有几个缺点:1、只有数据图才能用数据游标功能,如果是一张图片,数据游标功能就失效了。此外,只能
获取图上的数据点的坐标,非数据点的位置坐标是获取不到的。2、获取的坐标只能显示在图上,并不能得到它并进行处理,比如说你想将自己在图上先后选取的坐标点用折线图连起来,不好意思,办不到。
二、添加鼠标点击事件的监控函数,实时获取鼠标点击处的坐标值
具体的程序如下截图所示。在画图的时候,记得把句柄赋值给一个变量。本例子中我将画出来的数据图的句柄赋给h,然后加入一句语句:set(h,'ButtonDownFcn',{@myim_ButttonDownFcn,handles});。
ButtonD
ownFcn是监测到点击后执行的函数,所以这句程序的意思就是当监测到图像h上有点击事件时,就执行
myi
m_ButttonDownFcn这个函数。然后自己编辑一个
myi
m_ButttonDownFcn函数,获取当前坐标上鼠标的位置信息就行了。
这种方法的特点是:1、可获取数据图上的数据点的坐标,非数据点的位置坐标获取不到。如果是一张图片,则所有像素点的位置都可以获取的到。2、可以对获取的坐标值进行处理。
其实,自己改动一下ginput函数,就可以将其十字光标限制到图像区域,此外,还可以修改十字光标的粗细、颜色等等。比如下面的动图所示: 这个改动说来话长,下一篇具体介绍一下如何修改ginput函数。
三、利用matlab自带的ginput函数
ginput提供了一个十字光标使我们能更精确的选择我们所需要的位置,并返回坐标值。函数的三种调用形式为:
[x,y] = ginput(n)
[x,y] = ginput
[x,y,button] = ginput(...)
对于[x,y] = ginput(n),能使你从当前的坐标系中读取n个点,并返回这n个点的x,y坐标,均为n×1的向量。可以按回车提前结束读数。[x,y] = ginput 可以无限的读取坐标直到按下回车键。[x,y,button] = ginput(...) 返回x和y的坐标,以及button值(1=左键,2=中,3=右)。
本例中,我们添加了一个按钮,在按钮的回调函数中调用ginput来实现鼠标取值,程序如下截图所示:
具体的程序注释都体现在截图中了。这种方法的特点是:
1、有一个十字光标实时跟踪鼠标,可以帮助更精确的取值;但是十字光标覆盖整个界面,简直不要太丑。
2、除了我们想要取值的图像区域,整个界面都可以点击并获取坐标值(非图像区域的坐标值是按照数据图的坐标轴扩展出来后给定的),不够严谨。这也是ginput函数被广泛诟病的地方。
其实,自己改动一下ginput函数,就可以将其十字光标限制到图像区域,此外,还可以修改十字光标的粗细、颜色等等。比如下面的动图所示: 这个改动说来话长,下一篇具体介绍一下如何修改ginput函数。