[Matlab / Octave] 數據化圖片資料




假設你手邊只有資料的圖片檔,要如何單從圖檔取出圖檔內的數據呢?
這邊使用上方的圖,來做說明。現在有一張LED 的電流對流明的關係圖,假設想從裡面取出250安培的電流會對應多少流明的資料,要怎麼做?

接下來使用的方法,只限制在當x和y軸都是線性坐標的情況才能使用,若是對數或指數座標就不適用了。
主要的指令會是

[x,y] = ginput(n)

ginput會回傳n次你在圖形物件上用滑鼠點的n個座標x跟座標y,想在點選n次前就結束的話,可以按return鍵結束。

display('press max x and min y');
[pixel_maxx, pixel_miny]=ginput(1);
max_x=input('max_x=');
min_y=input('min_y=');


display('press min x and max y');
[pixel_minx, pixel_maxy]=ginput(1);
min_x=input('min_x=');
max_y=input('max_y=‘);

剛開始必須先定義圖形物件的座標範圍。
第一步,先點選圖片中x最大y最小的座標點(下圖紅圈圈處):
然後輸入x軸最大值:3000,和y軸最小值:0。

第二步則是要點選圖片中x最小y最大的座標點(下圖紅圈圈處):
然後輸入x軸最小值:0,和y軸最大值:800。

輸入完,接下來會由下方程式碼計算,剛剛在圖片裡點到的pixel位置轉換成圖片座標的比例。
pixel_originx=pixel_minx;
pixel_originy=pixel_miny;
x_ratio=(max_x-min_x)/(pixel_maxx-pixel_minx);
y_ratio=(max_y-min_y)/(pixel_maxy-pixel_miny);

接著要開始點選圖片上的資料了(這邊以5個資料點舉例),可以選擇自己需要多少點來完成資料的截取,輸入完多少資料點,再在圖片上點選對應點數的資料,接下來就會由前面算好的座標軸比例,算出真正的資料值了!(這邊舉5點為例)

display(['now, select ' num2str(num) ' points on the figure']);
for i=1:num
  [x(i), y(i)]=ginput(1);
  x2(i)=(x(i)-pixel_originx)*x_ratio+min_x;
  y2(i)=(y(i)-pixel_originy)*y_ratio+min_y;
  disp(['you have ' num2str(num-i) ' points to select']);
endfor





跑完程式會跳出一個圖,讓你看一下實際點選的資料點跟做完內插完後的資料的比較。
最後資料點也會存成你輸入的存檔檔名(“test.txt”)。

範例程式的用法,第一步先將檔案存在你想要執行運算的檔案位置,並在command window內輸入cd,指引Octave到你的目標檔案位置,然後再呼叫function,function的第一個輸入的參數是你想讀的圖片檔名,第二個是你想存資料檔案的檔名,第三個則是你希望內差資料點的解析度,以本題為例,我是希望他每1A可以有一筆資料,所以就輸入1。

範例程式是用Octave來寫的(沒辦法,窮...),但Matlab應該也通用,有問題會再更新的。

留言

這個網誌中的熱門文章

[理財/記帳]google表單結合iphone捷徑 自製記帳app

[理財/記帳]利用google表單記帳雲端化 - 免費模板下載@ Mimi's learning notes

[理財/記帳]懶人記帳-現金流+信用卡管理記帳法-不用天天記帳