matlab从曲线图提取数据
同学用肉体一顿饭让我帮他做下这个DDL

样图是一张非常扭曲的三虚线图他甚至想OCR识别x轴y轴坐标单位

- 上谷歌查了查,对于曲线图提取数据基本上是手动在曲线上取几个点,然后由这个几个点开始遍历领域点,判断领域点是否是黑色,然后再遍历这个黑色点的领域,最终找出一条最长的线便是曲线,一种类似曲线拟合的做法?
- 知乎专栏提供了一种思路,先把曲线图上无关信息去掉,然后提取最大的连通区域,就是所需要的实线,只可惜样例图要做的是虚线。
第一种方法是同学AA想要的,不过英国人嘛,只告诉他要这样做,并没有告诉他基本思想,所以我们基于第二种方法拓展尝试一下。
清洗图像
所给的图像是RGB图像,且有噪声点,先将图像灰度化,计算图像阈值,通过阈值将图像二值化。

提取真实区域
想要的真实区域就是下图中使用红框标出的区域
法1
一开始的想法是先在图片的(end*0.8:end-10,)区域中霍夫变换识别出下边框,然后取下边框的(,1:10)部分识别左边框,取左边框的最上端坐标和下边框的最右端坐标,作为分割图像的基准,真实区域就分割出来了。
- 提取下边框很顺利

- 提取左边框不是很顺利

- 提取右边框也不是很顺利

- 提取上边框很顺利

虽然和计划的有所偏差,但通过上边框的最左端坐标和下边框的最右段坐标,作为分割图像的基准,得到的真实图像理论上是相同的。
法2
对于样例图,真实区域是封闭的,是图中的最大连通区域,那找最大联通区域也可以提取出样例图的真实区域。

再取得该区域最左上端白点坐标和最右下端白点坐标,作为分割图像的基准,得到真实图像。
真实图像如图所示

再次清洗图像
为了方便起见,下文中“图”、“图像”指的是上一步中得到的真实图像,而不是原始图像。
对于得到的图像,仍然存在边框、刻度线、右下角标识区域等无关信息。
- 边框可以直接通过上一步法1中得到的边框坐标数组去掉。
- 刻度线以左边框的刻度线为例,遍历图像(,1:5)范围内,若该点是黑点,则从该点开始,向右寻找最大的直线区域,去除。
样例图中存在曲线与刻度线相交的情况,我采用的方法是对于该点,如果24领域中的黑点总数大于一个阈值,则认为该点是曲线上的点,保留。 - 右下角标识区域直接找取联通区域,如果该连通区域的大小大于阈值,认为是标识区域,去除。
得到的结果图像,边界存在问题,有待改进:

分离曲线
三条曲线都不是实线,没法通过找最大联通区域的方法逐个分离,但因为不同曲线中实线部分的长度是不一样的,所以可以贪心一下,从第1列开始,以某个阈值add_len为步长,找最大连通区域,再进行拼接,以图中最上面一条曲线为例:
- 首先取图像(:,1:10)区域中的最大联通区域,或者取3个联通区域,认为联通区域在列上的坐标极小值为其高度值,高度值越小则越高,最高者则为想要取得最上面一条曲线。

- 然后取得该联通区域中最右端的点n1(x,y),再取(:,y+1:y+add_len)中的n个联通区域,对于每个联通区域,找出其最左端的点n2(x1,y1),求n1与n2之间的欧式距离,认为欧式距离最短的就是该曲线在(:,y+1:y+add_len)的部分,然后重复该步,直到y值无限接近于图像最右端。
- 对于上一步也有不同的做法,取得该联通区域中最右端的点n1(x,y),在从i=1开始循环,取(:,y+1:y+add_len)中的i个最大联通区域,对于第i个区域,他的面积总是第i大的,找出其最左端的点n2(x1,y1),求n1与n2之间的欧式距离,若欧式距离小于某个阈值,则认为该联通区域是该曲线在(:,y+1:y+add_len)的部分,然后重复该步,直到y值无限接近于图像最右端。
过程如图:

两种做法进行比较,得出的曲线基本相同。
取得最上端曲线a如图所示:

然后将该曲线在图中去除,再重复之前的做法,取得第二条曲线b。对于第二条曲线,add_len需要改小,欧式距离的阈值需要改大。

将第二条曲线去除,得到第三条曲线c

可以看出第三条曲线的图像存在噪点,可以用一个区域对噪点清洗,得到第三条曲线c

导出数据
将a,b,c的坐标值与图像的size相除,再乘上单位,即可得到数据。
matlab从曲线图提取数据的更多相关文章
- [数据科学] 从csv, xls文件中提取数据
在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...
- 曲线提取数据Engauge Digitizer
可导出CSV格式数据 其它参考: http://blog.sina.com.cn/s/blog_4ae65b4d0100z8cg.html 其它曲线提取数据的软件还有: GetData.Windig ...
- 提取数据用strpos函数比较,预期和实际不符问题解决
在我提取数据时,数据是一串字符串,第一个数据和要比较的字符是相等的可是却是相反的结果 . 测试if(0==false)结果如图 执行结果 说明0和false相等.我的程序开始是这样的 第一个数据是正确 ...
- matlab中读取txt数据文件(txt文本文档)
matlab中读取txt数据文件(txt文本文档) 根据txt文档不同种类介绍不同的读取数据方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如te ...
- 提取数据表保存为XML文件
//连接数据库 SqlConnection con = new SqlConnection("server=****;database=****;uid=sa;pwd=********&qu ...
- Stata和Matlab联合处理金融数据
Stata是统计学专业软件,可以很方便的对数据处理,但几乎只能按照整行整列进行,而且每次只能加载一个矩阵(dta文件),如果要用到多个矩阵数据进行操作或进行复杂的循环控制,就力不从心了. 而Matla ...
- 从数据库提取数据通过jstl显示在jsp页面上
从数据库提取数据通过jstl显示在jsp页面上 1.ConnectDB.java连接数据库,把数据转换成list public class ConnectDB { private final stat ...
- 处理文本,提取数据的脚本-主要就是用sed
处理文本,提取数据的脚本 #! /bin/sh | sed 's/)<\/small><\/td><td>/\n/g' # 用换行符替换 # 删除带有分号的行 # ...
- 002 requests的使用方法以及xpath和beautifulsoup4提取数据
1.直接使用url,没用headers的请求 import requests url = 'http://www.baidu.com' # requests请求用get方法 response = re ...
随机推荐
- Mybatis动态排序问题
参考https://blog.csdn.net/LitongZero/article/details/83753813 注意事项:使用这样连续拼接两个注入参数时,只能用${},不能用#{}.
- 前端 CSS 注释
/*开头 */ 结尾 /*这是注释*/ <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- 2019-04-15 Python之利用matplotlib和numpy的简单绘图
环境:win10家庭版, Anocada的 Spyder 一.简单使用 使用函数 plt.polt(x,y,label,color,width) 根据x,y 数组 绘制直,曲线 import nump ...
- Javascript动态生成的页面信息爬取和openpyxl包FAQ小记
最近,笔者在使用Requests模拟浏览器发送Post请求时,发现程序返回的html与浏览器F12观察到的略有不同,经过观察返回的response.text,cookies确认有效,因为我们可以看到返 ...
- js写一个chrome 插件
访问网站的时候,最烦的就是一些弹窗和广告.于是,就想着能不能在访问特定网站的时候,执行一段js脚本,去除页面的广告.于是乎,好像 chrome 插件可以实现. 这里,以 百度 的网站为例 新建 sim ...
- 蓝桥杯c/c++省赛真题——明码
标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.###16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. ###一个字节可以存储8位信息,用3 ...
- 透析SOA、RPC、SOAP、REST、ICE、ESB模型发展史
最初的程序全是单机程序,没有网络,没有RPC,更没有RESTful.程序猿写的东西孤独运行在单机上. 那时的程序猿们语言相通,参与开发同一套系统的团队可以面对面沟通. 网络出现了.网络,也带来变乱.网 ...
- 2017-2018_OCR_papers汇总
2017-2018_OCR_papers 1. 简单背景 基于深度的OCR方法的发展历程 近年来OCR发展热点与趋势 检测方法按照主题进行分类 2. ECCV + CVPR + ICCV +AAAI ...
- 简单尝试Spring Cloud Gateway
简单尝试Spring Cloud Gateway 简介 Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的.Spring Cloud Gateway构建于Sprin ...
- C# 将文件夹中文件复制到另一个文件夹
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...