MATLAB導入別人論文的曲線圖片並將數據生成TEXT格式


  在自己寫論文時,難免需要一些實測數據。很多情況下難以做相關實驗或實驗成本高。最簡單的方法是引用別人論文中的一些原始實驗數據進行分析或用自己的算法計算。本人最近需要的是火車軌道上的振動數據。

 

所需工具:MATLABPC自帶的畫圖和截屏工具

 

第一步,預處理

首先,肯定要截取別人論文中的數據曲線,保存成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的值非01.

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的值非01.

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

 

%----平移坐標軸---圖片總大小: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);

 

 

完成!  朋友們多多點贊支持~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM