1 引言
在调研文献或者整理资料的过程中,往往会找得到相应的地图、曲线图、散点图等(如图1.1),却偏偏找不到完整的数据表格。为了解决这一痛点问题,本文利用Matlab 2021a软件实现了较为精确的图片坐标拾取。
图1 坐标拾取例图
2 图片坐标拾取——软核篇
2.1 代码加载及软件下载
2.1.1 代码加载
Matlab软件目前已更新多个版本,本文采用的是Matlab R2021a版本,其他版本也可以使用,操作雷同。代码脚本下载链接:
链接:https://pan.baidu.com/s/10taPWgUiSWGVbxH3nnqNDQ
提取码:CUPB
打开Matlab会进入以下默认界面(图2.1),需要将extract1.m(或extract2.m)和所需要提取的图片文件复制到界面左方“当前文件夹”中,然后双击脚本文件打开。
图2.1 Matlab R2021a脚本加载
2.1.2 软件下载
以下为Matlab R2021a百度盘链接,内有安装说明,若过期请私信或留言找补
链接:https://pan.baidu.com/s/1fYA-rkEI2xgDf0pnzFpW_Q?pwd=CUPB
提取码:CUPB
2.2 地图坐标提取
当完成2.1中所述步骤后,成功打开脚本后,需要修改第四行代码:
im=imread('图片.png');%读入图片(替换成需要提取的图片,包括"."后面的后缀)
将’图片.png’改为所需要提取坐标的图片,本例中的地图文件名为“井位.BMP”,因此修改后代码:
im=imread('井位.BMP');%读入图片(替换成需要提取的图片,包括"."后面的后缀)
此处需要注意的是,不仅要修改前面的图片名,还需要修改文件后缀(图2.2)。
图2.2 修改代码
点击编辑器代码框上方“运行”按钮,开始运行代码,代码成功运行后会弹出名为“Figure1”的图像窗口,并在编辑器代码狂下方的命令行窗口中出现提示,接下来用鼠标按照顺序左键点击一下图像中的坐标框左上角顶点与右下角顶点(图2.3)。
图2.3 图像窗口操作
完成上述操作后,命令行窗口会继续提示下一步操作(图2.4),在命令行窗口输入横坐标轴最小值或者起点值,本例中的横坐标最小值为15293300,然后按下回车键。
命令行窗口继续提示下一步,在命令行窗口输入横坐标轴最大值或者终点值,本例中的横坐标最大值为15306300,然后按下回车键。
命令行窗口继续提示下一步,在命令行窗口输入纵坐标轴最小值或者起点值,本例中的纵坐标最小值为5140900,然后按下回车键。
命令行窗口继续提示下一步,在命令行窗口输入纵坐标轴最大值或者终点值,本例中的纵坐标最大值为5154500,然后按下回车键。
图2.4 输入坐标起点终点值
接下来可能需要等待一会儿,当图像窗口“Figure1”中的图像变为红色(图2.5)表示代码运行完成。可用鼠标左键点击相应点的位置读取坐标。
图2.5 拾取井位坐标
在选取的点处单击鼠标右键,选择“将游标数据导入工作区”,接下来会弹出“输入变量名称”窗口,可以修改存储数据的名称,也可以直接左键单击确定使用默认名称“cursor_info”(图2.6)。
图2.6 储存提取的坐标数据
在主界面右侧的工作区中找到“cursor_info”的文件,双击左键打开,选中“Position”列,然后单击右键-复制,再到Excel表格中粘贴即可得到准确结果(图2.7)。
图2.7 提取坐标结果数据查询
与真实结果对比如下:
表2.1 井位坐标拾取结果对比
原始坐标 |
图像拾取坐标 |
||
X |
Y |
X |
Y |
15294500 |
5152070 |
15294500 |
5152100 |
15297900 |
5152070 |
15297900 |
5152100 |
15301200 |
5152070 |
15301200 |
5152100 |
15304600 |
5152070 |
15304600 |
5152100 |
2.3 散点图坐标提取
关于散点图坐标拾取操作,与地图坐标提取类似,流程相同不再赘述。以图1为例,坐标提取结果如图2.8所示。
图2.8 散点图坐标提取结果
与实际结果对比如表2.2所示,可以看出,在图片清晰情况下,只要准确输入左上顶点与右下顶点,并按照图片标好x轴与y轴的取值范围,可以相当精确地提取出散点坐标,本实例中的平均相对误差仅为3.33%。
表2.2 散点图坐标拾取结果对比分析
真实值 |
提取值 |
相对误差 |
||
年份 |
产量 |
提取年份 |
提取产量 |
|
1990 |
46 |
1990.075 |
45.98333 |
0.036232 |
1991 |
16 |
1990.929 |
16.28333 |
1.770833 |
1992 |
38 |
1991.942 |
38.28333 |
0.745614 |
1998 |
45 |
1997.863 |
45.43333 |
0.962963 |
2000 |
35 |
2000.103 |
35.53333 |
1.52381 |
2001 |
2 |
2000.957 |
2.533333 |
26.66667 |
2002 |
15 |
2002.023 |
15.18333 |
1.222222 |
2007 |
27 |
2007.037 |
27.1 |
0.37037 |
2011 |
23 |
2010.985 |
23.25 |
1.086957 |
2017 |
42 |
2017.065 |
42.31667 |
0.753968 |
2018 |
34 |
2018.026 |
34.61667 |
1.813725 |
2020 |
11 |
2019.999 |
11.33333 |
3.030303 |
平均相对误差(%) |
3.331972 |
2.4 曲线图坐标提取
关于曲线图坐标拾取操作,前半部分与地图坐标、散点图提取类似(如图2.9),即也是要先拾取左上顶点与右下顶点,然后再输入x轴与y轴的取值范围,剩下的就交给程序完成。
图2.9 曲线图提取结果
在完成上述步骤后,打开Matlab主界面,在右侧的工作区会出现曲线提取的结果,第一个ans条目即为提取曲线的x坐标与y坐标集合。在本实例中,将数据复制粘贴到Excel,以左侧列数据为x,右侧列数据为y,然后插入“带平滑线的散点图”(如图2.10),接着再图表中插入“乘幂趋势线”,勾选“显示公式”和“显示R平方值”(如图2.11)。
图2.10 导入曲线散点图
图2.11拟合曲线
本实例中的曲线原式为y=x²,通过图片提取后的结果为y=0.9663x2.0143,可以说结果是非常准确的。根据图片的曲线类型,可以在Excel中按需要选取趋势线类型,常用的曲线类型都可以拟合。如果出现比较罕见的曲线类型,也可以在Matlab中工具箱里的Curve Fitting中进行拟合。
3 总结
在图片质量较高的情况下,上述操作就可以相当准确地提取所需数据。如果图片较为模糊或者变形,这就需要引入机器视觉的入门技术——轮廓提取,该类技术介绍将放入硬核篇。
可以看出,通过图像来拾取地图坐标的结果很精确。