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

 

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

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

第一步,预处理

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

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

 

 

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

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

 

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

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

 

第二步,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,神奇吧~

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

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

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

 

然后执行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; 

 

可得下图:

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

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

 

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

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

grid on; 

 

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

嗯,上图的感觉就对了。

 

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

 

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

tempx = tempx - 146;

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

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

grid on;

得图:

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

 

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

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

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

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

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

 

即:

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;

可得:

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

 

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

 

 

但是当把所有点连线时:

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;

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

 

现在完全光滑了。

 

好了,赶快保存成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);

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

完整代码

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

你可能感兴趣的:(matlab)