• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

  在自己写论文时,难免需要一些实测数据。很多情况下难以做相关实验或实验成本高。最简单的方法是引用别人论文中的一些原始实验数据进行分析或用自己的算法计算。本人最近需要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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap