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