您好,欢迎访问三七文档
当前位置:首页 > 幼儿/小学教育 > 小学教育 > 利用matlab提取图片中的曲线数据
利用Matlab提取图图片中的数据从事科研或者工程的人员在文档撰写过程中,常需要将文献中的曲线与自己的结果对比,为获取原始数据,一种常用的办法是手动描点,即将原始曲线放大然后打印出来,选取一定数量的点,读出其横纵坐标,然后重绘。对于较为平坦的曲线,这种方法当然可行,但当曲线数量增加,曲线变化复杂,这种方法工作量可想而知。前段时间由于原始数据丢失,仅剩几十幅图片,本人尝试过手动描点,经历几个小时奋战,实在无法继续,索性转向matlab,借助其强大的数据处理能力,编写了两个GUI的小软件image2data、data_poly提取数据,如今大功告成,遂于大家分享。2010-12-26yc97463240@126.com本文分三部分:1、数据提取实验演示;2、软件编写要点;3、附录。仅关心如何使用的朋友请看第一部分,有兴趣深入钻研的兄弟看看第二部分,软件以功能实现为主,界面和操作其次。1、数据提取演示实验原始数据来源:安华高科技数据手册(HSMP-38XXandHSMP-48XXSeries),如图1所示。目标曲线:提取1MHz频率下的PIN二极管电容与反偏电压之间关系曲线。图1包含目标曲线的原始图像实验步骤:Step1:制作jpg图片。从pdf中copy上述包含目标曲线和坐标的曲线,paste到ppt的空白页面当中,然后调整到合适的大小saveasfigure1.jpg到我的文档。图2利用ppt制作jpg格式图像Step2:导入图片,填写相关参数。运行image2data软件(程序采用matlabR2008b编写),按照界面给出的顺序填写横纵坐标的最大最小值,然后导入图片,如下图所示。图3导入图像并输入相关参数Step3:坐标轴标定。按下面板上的zoomon按钮进行图像放大,zoomout按钮恢复初始显示大小,panon按钮采用鼠标拖动图像,panon/off按钮退出放大或者拖动的鼠标操作模式,空格键表示取点操作,delete键表示删除上一次取点操作,状态栏的num显示当前鼠标取点总数目(注意,初始点数为2,然后存处4个坐标轴标定坐标,剩余用来存储曲线坐标)。值得指出的是,每次放大或者拖动操作完毕后,必须按下panon/off按钮,才能用空格键进行取点操作。图4坐标轴定标Step4:曲线描点。按照上述操作反复进行图像放大、拖动、取点,状态栏的cpx和cpy用于显示当前坐标(注意,这个坐标图像坐标,y轴方向向下,后面坐标变换需要考虑),下图给出了描点完毕后的曲线,可以看出取点基本代表了曲线的全部信息。图5曲线描点Step5:数据处理及存储。按下demo按钮,描点后的曲线会显示在图像当中,按下process按钮,程序自动进行坐标转换,得到所有描点的真实坐标,按下save按钮,便会生成一个txt文本,数据记录其中(import和save按钮下都有文本输入框,本别代表输入文本和存储文本的名称,不带后缀)。图6拟合曲线效果图7数据记录文本Step6:数据后处理。由于以上数据是手动选取的,故分布不够均匀,下面我们通过数据拟合,然后重新采样得到等间距的数据(可能大家会问,为什么两个功能不做在一起呢?数据拟合是个比较麻烦的事情,本组曲线采用多项式拟合即可,可对于更多的曲线采用指数函数、正弦函数等才能得到比较好的结果,matlab中的cftool工具箱就包含了很多的拟合函数,为避免重复工作,仅编写了data_poly这个小软件用来数据拟合再采样,其他的拟合就靠cftool了)。运行data_poly,nth代表多项式拟合的阶数(一般6就够用了),num代表重新采样的数据个数,其他几个就不用解释了,默认输入文本为data.txt,输出文本为ndata.txt,数据拟合结果如下图所示。图8数据拟合再采样结果至此,数据提取过程完毕,可能操作上有些不便(毕竟只是小工具而已),但比起手动描点的速度和精度,可谓小巫见大巫。2、软件编写要点这两个小软件从构思到完成大概用了两天,功能的完成绝大部分归功于matlab丰富的函数库和方便的GUI,其中用到的主要函数主要有:imread,imshow,findobj,num2str,strcat,load,save,get,set.列表如下,更详细的介绍请参阅matlabhelp文档。表1主要函数列表IndexFunctionDescription1findobjLocategraphicsobjectswithspecificproperties2getQueryobjectproperties3imreadReadimagefromgraphicsfile4imshowDisplayimage5loadLoadworkspacevariablesfromdisk6num2strConvertnumbertostring7saveSaveworkspacevariablestodisk8setSetobjectproperties9strcatConcatenatestringshorizontally除了上述函数的掌握之外,还需要对matlab的GUI数据结构和函数响应有一定的理解,在此就不多讲了(多看matlabhelp相关例程就明白了)。编写程序之前,首先心中要有一个框架,做些什么,怎么做,顺序如何等。本软件的结构如下图所示:导入图像创建数据结构坐标轴定标曲线描点坐标变换数据后处理:拟合、重新采样、存储图9程序流程示意导入图像程序段:h_temp=findobj('tag','edit8');str_img=strcat(get(h_temp,'String'),'.jpg');%getfullnameofpictureimage_temp=imread(str_img);imshow(image_temp);%readandshow创建数据结构程序段:handles.cpx=0;handles.cpy=0;%gloablevariablesforcurrentpositionofmousehandles.idata=zeros(2,2);%thekeyvariableforobtainingcurvedataguidata(hObject,handles);坐标轴定标及坐标变换:%obtaininputaxisimformationtemp=str2num(get(findobj('tag','edit1'),'string'));xmin=temp;temp=str2num(get(findobj('tag','edit2'),'string'));xmax=temp;temp=str2num(get(findobj('tag','edit3'),'string'));ymin=temp;temp=str2num(get(findobj('tag','edit4'),'string'));ymax=temp;%saveaxistoglobalvariableidataidata(1:2,:)=[xmin,xmax;ymin,ymax];idata=[idata;handles.idata(3:end,:)];axis_p=idata(3:6,:);data_p=idata(7:end,:);%classidataxpmin=axis_p(3,1);xpmax=axis_p(4,1);ypmin=axis_p(1,2);ypmax=axis_p(2,2);%coordinatetransformdata_new=data_p;data_new(:,1)=data_p(:,1)-xpmin;data_new(:,2)=ypmax-data_p(:,2);data_new(:,1)=data_new(:,1)/(xpmax-xpmin);data_new(:,2)=data_new(:,2)/(ypmax-ypmin);data_new(:,1)=xmin+data_new(:,1)*(xmax-xmin);data_new(:,2)=ymin+data_new(:,2)*(ymax-ymin);%saveresultsasanewvariableidata(7:end,:)=data_new;handles.newidata=idata;guidata(hObject,handles);数据后处理代码段:%obtaininputdatax=handles.data(:,1);y=handles.data(:,2);n=str2double(get(findobj('tag','edit1'),'string'));np=str2double(get(findobj('tag','edit2'),'string'));xmin=str2double(get(findobj('tag','edit3'),'string'));xmax=str2double(get(findobj('tag','edit4'),'string'));%datafittingandsamlpingp=polyfit(x,y,n);xnew=[xmin:(xmax-xmin)/(np-1):xmax]';ynew=polyval(p,xnew);%saveresultsandplotcurveplot(x,y,'-*b',xnew,ynew,'-+r');legend('orignal','fitting');handles.ndata=[xnew,ynew];guidata(hObject,handles);3、附录3.1描点数据列表indexxyindexxy10.0663900.4432563110.0774380.25322320.1481530.4380023210.5563350.25086330.2415960.4319473311.2237890.24725740.3934420.4257133411.8078090.24378450.5458010.4168973512.3618110.24111260.6363240.4099963612.9750330.23848570.7940100.4039413713.4441890.23630480.9660660.3944123814.0398910.23376691.1149910.3878673914.4895870.231361101.3636120.3770924014.9058770.229847111.5037770.3710814115.3672530.227755121.7609900.3616424215.7614670.226464131.9770780.3540724316.3033020.224371142.3941120.3418284416.9136040.221877152.7007230.3343924517.2815370.220497163.1209610.3250424617.8184570.218983173.5268550.3175624718.3148750.216891183.9142760.3115064818.7295300.215510194.2354870.3066094919.3399400.214397204.4778560.3030025019.7020320.212972214.8165880.2987725119.9852820.212216225.3420310.292049235.6428010.288665246.0486960.284346256.6502030.278736267.0823790.274862277.7841300.269030288.2338260.265512298.8966760.260792309.3960130.2578093.2数据拟合结果LinearmodelPoly9:fittedmodel1(x)=p1*x^9+p2*x^8+p3*x^7+p4*x^
本文标题:利用matlab提取图片中的曲线数据
链接地址:https://www.777doc.com/doc-4505208 .html