有如下的波形图,如何从中精确提取出全部的数据:

1,将波形图片(截图)保存为test.png或test.jpg,并将图片放于matlab工作目录中,如下图示例所指定的目录中:

2,新建文件,输入如下程序代码,将文件保存为jpg2data.m(名字可以随便取):

代码:

% 提取图片中的曲线数据

clear,clc,close all

%% 图片与曲线间的定标

im=imread('test.jpg');%读入图片(替换成需要提取曲线的图片)

im=rgb2gray(im);%灰度变化

thresh = graythresh(im);%二值化阈值

im=im2bw(im,thresh);%二值化

set(0,'defaultfigurecolor','w')

imshow(im)%显示图片

[y,x]=find(im==0);%找出图形中的“黑点”的坐标。该坐标是一维数据。

y=max(y)-y;%将屏幕坐标转换为右手系笛卡尔坐标

y=fliplr(y);%fliplr()——左右翻转数组

plot(x,y,'r.','Markersize', 2);

disp('请在Figrure中先后点击实际坐标框的两个顶点(左上点和右下点),即A、B两点. ');

[Xx,Yy]=ginput(2);%Xx,Yy——指实际坐标框的两个顶点

min_x=input('最小的x值');%输入x轴最小值,已知图片,可直接赋确定值如min_x=-30;

max_x=input('最大的x值');%输入x轴最大值,可直接赋确定值如max_x=130;

min_y=input('最小的y值');%输入y轴最小值,可直接赋确定值如min_y=-2;

max_y=input('最大的y值');%输入y轴最大值,可直接赋确定值如max_y=5;

x=(x-Xx(1))*(max_x-min_x)/(Xx(2)-Xx(1))+min_x;

y=(y-Yy(2))*(min_y-max_y)/(Yy(1)-Yy(2))+max_y;

plot(x,y,'r.','Markersize', 2);

axis([min_x,max_x,min_y,max_y])%根据输入设置坐标范围

title('由原图片得到的未处理散点图')

%% 将散点转换为可用的曲线

%需处理的问题与解决思路

%(1)散点图中可能一个x对应好几个y <---> 保留mean()-std()到mean()+std()之间的y值 并取平均处理

%(2)曲线的最前端和最后段干扰较大 <---> 去掉曲线整体的前(如5%)和后5%

%(3)曲线的最顶端和最底段干扰较大 <---> 去掉曲线整体的上10%和下10%

%参数预设

rate_x=0.08;%曲线的最前端和最后段删除比例

rate_y=0.05;%曲线的最顶端和最底段删除比例

[x_uni,index_x_uni]=unique(x);%找出有多少个不同的x坐标

x_uni(1:floor(length(x_uni)*rate_x))=[];%除去前rate_x(如5%)的x坐标

x_uni(floor(length(x_uni)*(1-rate_x)):end)=[];%除去后rate_x的x坐标

index_x_uni(1:floor(length(index_x_uni)*rate_x))=[];%除去前rate_x的x坐标

index_x_uni(floor(length(index_x_uni)*(1-rate_x)):end)=[];%除去后rate_x的x坐标

[mxu,a]=size(x_uni);

[mx,b]=size(x);

for ii=1:mxu

if ii==mxu

ytemp=y(index_x_uni(ii):mx);

else

ytemp=y(index_x_uni(ii):index_x_uni(ii+1));

end

%删除方差过大的异常点

threshold1=mean(ytemp)-std(ytemp);

threshold2=mean(ytemp)+std(ytemp);

ytemp(find(ytemp<threshold1))=[];%删除同一个x对应的一段y中的异常点

ytemp(find(ytemp>threshold2))=[];

%删除距顶端和底端较近的点

thresholdy=(max_y-min_y)*rate_y;%y坐标向阈值

ytemp(find(ytemp>max_y-thresholdy))=[];%删除y轴向距离顶端与底端距离小于rate_y的坐标

ytemp(find(ytemp<min_y+thresholdy))=[];

%剩下的y求均值

y_uni(ii)=mean(ytemp);

end

%此时很多x_uni点处对应的y_uni为空,即NAN,要进一步删去这些空点

x_uni(find(isnan(y_uni)))=[];

y_uni(find(isnan(y_uni)))=[];

%画图

% figure,plot(x_uni,y_uni),title('经处理后得到的扫描曲线')

axis([min_x,max_x,min_y,max_y])%根据输入设置坐标范围

% 将最终提取到的x与y数据保存

curve_val(1,:)=x_uni';

curve_val(2,:)=y_uni;

%% 对提取出的数据进行拟合(按实际情况进行修改)

[p,s]=polyfit(curve_val(1,:),curve_val(2,:),4);%多项式拟合(为避免龙格库塔,多项式拟合阶数不宜太高)

[y_fit,DELTA]=polyval(p,x_uni,s);%求拟合后多项式在x_uni对应的y_fit值

hold on

% figure,

plot(x_uni,y_fit),title('拟合后的曲线')

axis([min_x,max_x,min_y,max_y])%根据输入设置坐标范围

% 输出数据到EXCEL

delete('test.xlsx');

data = [ x_uni y_fit ];

[m n]=size(data);

data_cell=mat2cell(data,ones(m,1),ones(n,1));%matrix转变成cell

title={'温度差','电压mV'};%添加变量名称,x轴,y轴变量名

result=[title;data_cell];%归纳变量名称和数据

S = xlswrite( 'test1.xls',result,'Sheet1' ); %保存数据到excel

保存文,运行(F5):

输入x最大最小值及y最大最小值:

到此就成功用matlab从图片中精确提取出数据!!

微信关注图中张十三的博客公众号,学习更多技术干货:

matlab从图表中提取数据相关推荐

  1. getdata提取曲线数据_Origin如何从图表中获取数据

    点击上方"蓝字",一起愉快的玩耍吧!Origin如何从图表中获取数据01图片分析软件安装 一.GetData Graph Digitizer安装 使用范围: 1.需要引用别人文章中 ...

  2. MATLAB figure中提取数据

    MATLAB figure中提取数据 (2011-10-26 14:26:21) 转载▼ 标签: 杂谈 分类: matlab figure画出来,提取数据有很多好处,方便保存,计算,加工,还可以导入到 ...

  3. matlab提取数据的一部分,matlab处理excel数据【怎么用MATLAB从excel中提取部分数据】...

    已经把excel的一列导入到matlab的工作区,怎么计算这一列数的均值.标准差.最小值.最大值以及中位数? 把这个EXCEL放到matlab目录下的work里,假设名为1.xls,然后在matlab ...

  4. matlab从fig图文件中提取数据

    matlab从fig图文件中提取数据 lh=findall(gca,'type','line'); cell_l = cellfun('length',get(lh,'xdata')); i_lh=f ...

  5. 从Matlab的Fig图片中提取数据,并保存成csv文件

    从Matlab的Fig图片中提取数据,并保存成csv文件 1.Fig图像是由单条曲线绘制 2.Fig图像是由双条曲线绘制 3.小结 本人亲自实测有效,但能力有限,目前仅用代码测试了 Figure图片单 ...

  6. R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series)、使用window函数从时间序列对象中提取数据子集

    R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series).使用window函数从时间序列对象中提取数据子集 目录

  7. python提取excel数据-代码详解:使用Python从不同表格中提取数据

    常用的表格数据存储文件格式--CSV,Microsoft Excel,Google Excel . Python通常称为粘合语言.这个名称归因于人们逐渐开发出的大量接口库和特征,也得益于广泛的使用和良 ...

  8. [Step By Step]SAP Visual Intelligence数据操作、地图信息显示(SAP HANA中提取数据)

    Instruction: 本案例从SAP HANA中提取数据,试图创建数据的地图显示.数据修正 View: http://www.cnblogs.com/omygod/archive/2013/04/ ...

  9. es6 取数组的第一个和最后一个_ES6:解构——JavaScript 从数组和对象中提取数据的优雅方法...

    转载请注明出处,保留原文链接以及作者信息 ES6 有很多新特性,它很大程度上提升了 JavaScript 的编程体验,并且也告诉外界,JavaScript 依旧强势. 其中一个新特性是其对数组和对象的 ...

最新文章

  1. 差分阻抗为多少_谈谈差分信号
  2. 关于举办第十七届全国大学生智能汽车竞赛的通知-加盖公章
  3. 征途猎魔mysql数据库_猎魔征途-猎魔征途官方首测版 - 超好玩
  4. bugzilla perl mysql apache windows,windows下apache安装bugzilla
  5. opencv 直线检测 java_OpenCV实现图像的直线检测
  6. 获取壁纸设置背景android,【Android学习】获取Bing 15天前到明天的壁纸,并设置为背景...
  7. 安全开发 | 如何让Django框架中的CSRF_Token的值每次请求都不一样
  8. Win7 64位下配置jboss7
  9. Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions发布1.1 CTP版本扩展
  10. jquery 省市区联动插件
  11. harmonyos2.0系统,Harmonyos2.0刷机包
  12. 基于ssm的航空订票系统
  13. 以下名字 不能作为c语言标识符的是,(完整版)《C语言程序设计》复习参考答案...
  14. 去法国,买哪些伴手礼既有面子又不破费
  15. Gitlab的安装及仓库创建
  16. 【数据治理】数据治理标准化白皮书 (2021 年)
  17. ec,easyclick常用函数大全,集合1
  18. 在线图片上传 POST文件
  19. 苹果手机文件转换html,手机html文件怎么打开?1分钟打开苹果html文件
  20. 用Python演奏《太阳照常升起》

热门文章

  1. 第一次CM--CosH.2
  2. 网站的容错性设计原则
  3. C++ 容器及选用总结
  4. Python 安装管理器 pythonz
  5. 贝叶斯统计:Inverted Beta与Three Parameter Beta分布
  6. UA MATH563 概率论的数学基础 中心极限定理4 独立一元随机变量的性质
  7. UA MATH563 概率论的数学基础 鞅论初步5 鞅的定义
  8. GIS坡度分析入门实例 - 使用SuperMap
  9. Windows驱动开发 - 设备对象初步学习
  10. Python 列表和元组