MATLAB导入别人论文的曲线图片并将数据生成TEXT格式

  在自己写论文时,难免需要一些实测数据。很多情况下难以做相关实验或实验成本高。最简单的方法是引用别人论文中的一些原始实验数据进行分析或用自己的算法计算。本人最近需要的是火车轨道上的振动数据。

 

所需工具:MATLABPC自带的画图和截屏工具

 

第一步,预处理

首先,肯定要截取别人论文中的数据曲线,保存成png格式“2017.0219-1.png”:

 

 

 

然后用PC机自带的画图软件简单截取图片,截取时要紧贴XY坐标轴:

 

再次用PC机自带的画图软件简单擦除或剪切图片,保存为:2017.0219-2.png

 

 

第二步,MATLAB登场:

 

首先,灰度处理:

I=imread ('2017.0219-2.png');

bw=rgb2gray(I);  %转换成灰度

bw1=bw>20;  %灰度值越大,颜色越浅.  bw1的值非01.

imwrite(bw1,'2017.0221-1.png','png')  %保存为png灰度文件。

 

此时可以看到图片2017.0221-1.png,神奇吧~

 

然后先看实线,用PC自带的画图工具(橡皮擦)将上图处理成如下(保存成2017.0221-2.png):

 

 

然后执行MATLAB

clc;

clear;

 

I=imread ('2017.0221-2.png');

bw=rgb2gray(I);

bw1=bw>1;  %灰度值越大,颜色越浅.  bw1的值非01.

[tempy,tempx] = find(bw1==0);

 

figure

plot(tempx,tempy,'.','MarkerSize',4)

%plot(tempx,tempy)

grid on; 

 

可得下图:

怎么感觉它可原图不一样?是不一样,因为图片的零点(0, 0)在左上角,所以需要对所有点的Y坐标进行镜面对称处理:

 

tempy = 0 - tempy + 419;  %X轴对称,image is 537*419px

plot(tempx,tempy,'.','MarkerSize',4)

grid on; 

 

嗯,上图的感觉就对了。

 

然后进行坐标平移:注意原图中零点的像素位置(146, 258PX

 

%----平移坐标轴---图片总大小:537*419px--------------------

tempx = tempx - 146;

tempy = tempy - (419-258);  %这个地方自己慢慢想想

plot(tempx,tempy,'.','MarkerSize',4)

grid on;

得图:

 

然后需要按比例缩放坐标轴,使其与原图片的比例一样。由下图看出原图2017.0219-1.png中:

坐标(0,0)的像素点为(232,285

坐标(100, 100)的像素点为(330, 180

X轴缩放比例为100/(330-232)y轴缩放比例为100/(285-180)

 

即:

tempx = tempx*100/(330-232)

tempy = tempy*100/(285-180)

 

plot(tempx,tempy,'.','MarkerSize',4)

axis([-150 400 -150 250]); % 设置坐标轴在指定的区间 xmin xmax ymin ymax

grid on;

可得:

 

此曲线和原图基本一致了,到此基本结束。

 

 

但是当把所有点连线时:

plot(tempx,tempy)

axis([-150 400 -150 250]); % 设置坐标轴在指定的区间 xmin xmax ymin ymax

grid on;

 

由图片可以看出,细节处呈锯齿状。主要因为有时同一个X值可能有多个Y值。可去重:

 

toDel = [];

for i=1:( length(tempx) - 1)

    if( tempx(i)==tempx(i+1) )

        toDel = [toDel i];

    end

end

for i=1:( length(toDel) )

    tempx( toDel(i) ) = []; %删除数组中第i+1个坐标点

    tempy( toDel(i) ) = [];

    toDel = toDel - 1;  %数组中每个元素都减一,因为删除一个元素后数组tempx的总体长度会减1

end

 

plot(tempx,tempy)

axis([-150 400 -150 250]); % 设置坐标轴在指定的区间 xmin xmax ymin ymax

grid on;

 

现在完全光滑了。

 

好了,赶快保存成TEXT...

fid = fopen('data-2017.0221.txt', 'wt');

for i=1 : length(tempx)  %  %.6f--小数点后6位精度; \t--制表符(tab键),用于区分每列

    fprintf( fid, '%.4f\t%.4f\n', tempx(i), tempy(i) );

end

fclose(fid);

 

 

完成!  朋友们多多点赞支持~

 

转载于:https://www.cnblogs.com/Sampson-9/p/6425076.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值