[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。
輸入完,接下來會由下方程式碼計算,剛剛在圖片裡點到的pixe l位置轉換成圖片座標的比例。
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應該也通用,有問題會再更新的。
範例程式!!
留言
張貼留言