MATLAB导入别人论文的曲线图片并将数据生成TEXT格式,利用matlab生成OTDRtxt格式数据。

 

  在自己写论文时,难免需要一些实测数据。很多情况下难以做相关实验或实验成本高。最简单的方法是引用别人论文中的一些原始实验数据进行分析或用自己的算法计算。本人最近需要OTDR的相关数据,原本格式是.sor,现在处理成.txt

所需工具:MATLAB,PC自带的画图和截屏工具

第一步,预处理

首先,肯定要截取别人论文中的数据曲线,保存成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的值非0即1.

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的值非0即1.

[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, 258)PX:

 

%----平移坐标轴---图片总大小: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);

完整代码

clc;
clear;
I=imread ('otdr.png');
bw=rgb2gray(I);
imshow(I);
[height,width,dim]=size(I);
tform=maketform('affine',[1 0 0;0 -1 0;0 height 1]);
B=imtransform(bw,tform,'nearest');%B中存储的是经过水平镜像变换后的图像
bw1=B>200;  %灰度值越大,颜色越浅.  bw1的值非0即1.
[tempy,tempx] = find(bw1==0);
figure
plot(tempx,tempy,'.','MarkerSize',4)
%plot(tempx,tempy)
grid on; 
%光滑处理
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)
%保存txt文件
fid = fopen('OTDR.txt', 'wt');
for i=1 : length(tempx)  %  %.6f--小数点后6位精度; \t--制表符(tab键),用于区分每列

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

end
fclose(fid);

OTDR.TXT数据文件链接:https://download.csdn.net/download/lizhou011/10880057

引用博客:https://www.cnblogs.com/Sampson-9/p/6425076.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值