当前位置:   article > 正文

getdata提取曲线数据_曲线数据提取这块,MATLAB拿捏的死死的

getdate 闭合曲线

好一阵子没和大家聊Hao系列工具了

最近在HaoCurve上花了不少时间,计划着年底之前完成今年最后一次的升级更新

最终的成品恐怕还要再等上一段时间,今天我打算先简单介绍下这两天刚完成的一个还挺有意思的功能

不熟悉HaoCurve这个工具的朋友,可以戳下方的文章先了解一下

文章链接:MATLAB如何提取曲线原始数据

这次功能开发的需求很容易理解,也很常见,就是如何提取一个封闭曲线的数据

bb03317a7b2905f94c251f85ce675adb.png

提过类似需求的朋友非常多,最简单的例子是水滴的轮廓数据,汽车工程上会碰到的例子是发动机万有特性曲线

需求听起来似乎很简单,但是真到开发的时候,到处都是难点

1) 就拿发动机万有特性曲线举例,在坐标系里,一个x对应好几个y值,怎么识别出每一个点

a57867f77f39c35592f93f00e9ab7ce9.png

2) 识别完每个点之后,怎么判断哪几个点属于哪几条曲线

2e8e00a5f2392398eb7d5fe5f25409c7.png

3) 所有曲线的点分类好了之后,又该头疼各个点之间的排序问题了,哪个点在前,哪个点在后,一不留神就是一坨乱线

257c6bc5926df6e4e701f55a010ce240.png

大大小小的问题还有非常多,光这一个功能写了一个多星期,代码撸的头顶都要抓秃了,好在最终的结果还不错

5fa1a7061daeaa10a62e95d5f9bcfb66.png

接下来逐一介绍下,HaoCurve在开发过程中是如何解决上述这些问题的

1

之前HaoCurve在提取曲线数据时,使用的方法是,在固定步长下根据rgb颜色数据识别出有效点,然后计算有效点的纵坐标平均值

在单值函数曲线的情况下,也就是一个x对应一个y,这种方法是没有问题的,但是碰到像封闭曲线这类情况,一个x对应多个y,识别出来的点是非常离谱的

ce1a27af65087c00957ef4a438c63521.png

然后我就在想,有没有办法把这种“一对多”的情况转变成“一对一”的情况

后来想到的办法是,把一张图片切割成很多张大小相同的小图片,有点像网格法,然后对小图片中的曲线进行识别

我把横坐标固定步长的设计沿用到纵坐标,识别封闭曲线或者是多条曲线的时候,需要同时对横坐标和纵坐标的步长进行设置

af64a5cc976bb335af9165c024cb23f9.gif

2

虽然曲线上的所有数据点都识别出来了,也可以导出,但是对用户来说,这些数据完全没法用,全是乱的,根本不知道哪些点属于哪条曲线

这也是整个功能开发过程中最难的部分,如何对识别出来的数据点进行曲线分类

能够全自动分类识别当然是最好的,但是在尝试了十几种办法之后,始终没能找到令人满意的解决方案

我只能退而求其次,半自动分类识别,那也比纯手动强啊

于是,这个问题的关键就变成了,怎么才能让半自动的手动操作部分更顺手

我新增了3个按钮,分别是预分类,合并,还有拆分

预分类按钮很好理解,承担了半自动中的自动操作部分,会根据点和点之间的距离进行分类,如果距离低于一个阈值,这部分点就会被归为一条曲线上

逻辑上其实没啥大毛病,但是在实际操作中会产生各种误识别,比如,曲线是用虚线画的,能给你识别出十几条曲线来,两条曲线如果交叉了,就会被误当成是一条曲线

1c0c976873b42429d1023d2d42565d00.gif

所以碰到误识别的情况,就需要通过合并按钮和拆分按钮进行手动处理

合并按钮的作用是,点击合并按钮,按钮显示红框,表示合并功能激活状态,然后在图中选取多条曲线,最后点击合并按钮结束,多条曲线就通过手动的方式整合成一条曲线了

d11e56991fd84cd12a2f6d6a509f4f04.gif

点击选取曲线的功能很有意思,设计的细节我很喜欢,在曲线上点击任一点之后,整条曲线上每个点都会用圆圈标示,曲线合并后,之前不同曲线的不同颜色,也会设置为同一种颜色

拆分按钮的作用是,像交叉线的误识别,通过这个按钮可以拆分成两条不同的曲线,不过这个功能目前还没有做完,就不给大家做演示了

用一个动图演示一下整体的处理效果

b455d6c33927a30ede548632a153d8e9.gif

3

最后一个头疼的问题,所有点分类到相应曲线之后,如何对一条曲线上的点进行排序,从哪里来到哪里去

对于单值函数曲线来说,这完全不是个问题,横坐标最小的点是起点,横坐标最大的点是终点

但是对于像发动机万有特性曲线、轮廓曲线这类情况,一个x对应多个y,是没办法单一的从横坐标值或者纵坐标值来判断的

我考虑过,从极坐标的角度去解决问题,但是还是会有一样的问题,因为相同角坐标上可以对应多个径向坐标的点

我还尝试过一种方法,曲线上取任一点,搜索周围最近的点,如果最近点距离高于某个阈值,相当于走到尽头了,就停止搜索,认为这个点是曲线的端点,再通过最近点的方法把这条曲线上所有点的顺序捋一遍

但是这个方法的效果实在是太糟糕了,因为碰到虚线类曲线,很容易把虚线端点默认为曲线端点

在找曲线起点终点的问题上,我又试了十几种方法,最后终于找到了一个效果还不错的

曲线上任取一点,用最近点的方法先把曲线上所有的点走一遍,同时记录相应的最近距离。最后在所有最近距离中取最大值,如果最大值高于10倍的平均最近距离,则认为是曲线的端点

这种方法的排序准确率很高,即便有极端情况排序乱了,但整体顺序还是顺的,只需要把数据顺序微调一下就解决了

20e6869c34e0e5eefbac1653ed76169b.png

35ff7869cf5e2fa7df1318bd504482c3.png

以上就是今天关于HaoCurve开发过程中最头疼的3个问题的分享

其实还有很多零零碎碎的小问题,就不深入聊下去了,都是平时工具开发过程中的日常

至于新版HaoCurve的发布,像我之前说的,还要再等上一阵子,因为新功能和旧功能之间还需要磨合兼容,需要一些时间做集成和测试

期待HaoCurve可以尽快和大家见面

最后祝大家,周末愉快!

作者介绍打浦桥程序员

滞销工具开发人员

和你一起用MATLAB的角度看世界

86c7db4947bc3fd1755b79349fb0cf90.png
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/980220
推荐阅读
相关标签
  

闽ICP备14008679号