在自己寫論文時,難免需要一些實測數據。很多情況下難以做相關實驗或實驗成本高。最簡單的方法是引用別人論文中的一些原始實驗數據進行分析或用自己的算法計算。本人最近需要的是火車軌道上的振動數據。
所需工具: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);
完成! 朋友們多多點贊支持~