標籤:

Matlab如何從曲線圖中提取原始數據

前陣子跟朋友聊天,聊到一個問題,比較有意思,是關於獲取曲線圖中的數據。無論是在學習還是工作過程中,肯定會有那麼幾個時刻,比如看到了一張扭矩轉速圖或是電池特性圖,很想獲取這些曲線圖中的原始數據。

於是我就這個問題上網搜索了一下,其中有一篇比較好的帖子matlab提取圖片中曲線的數據_百度文庫,有興趣的朋友可以閱讀一下。

其中的代碼,我就不搬上來講了,大致描述一下其中涉及的兩種處理方法:

nn

1) 第一種方法就是描點法,利用ginput函數進行滑鼠取點,得到足夠多的點之後,也就是常規的數據處理了。這種方法存在的一種弊端就是,一幅圖需要進行大量的取點,不適用於批量處理。

nn

2) 第二種方法就是找圖形中的「黑點」的坐標。這種方法存在的一種弊端就是,對圖的預處理質量要求比較高。

nn

這兩種方式,大家都可以嘗試一下,找到屬於適合自己工作情況的方法。今天,我就來分享一下對於這個問題我的處理方法,

nn

這是我昨天剛完成的一個小工具,用於提取圖像曲線的數據,其中涉及到八個功能,我將逐一演示介紹:

nn

  • 載入圖片
  • 獲取圖片中曲線區域
  • 刪除邊框
  • 刪除網格
  • 刪除雜點
  • 生成新的曲線
  • 數據導出
  • 自動處理

1 載入圖片

nn

這一步實現的功能是,選取圖片文件,並通過imshow函數呈現出來。

nn

imshow(Pic.png)

nn

在上一篇帖子中「Matlab如何動態呈現計算結果」,我介紹了Matlab如何實現文件選擇的功能,其中涉及到uigetfile函數,有興趣的朋友可以點擊這篇帖子的連接去查看具體用法。

nn

[filename, pathname] = uigetfile({*.*,},File Selector,MultiSelect, off);

nn

2 獲取圖片中曲線區域

nn

這一步實現的功能是,對圖片中曲線區域進行選取。

nn

由於之前極少有機會涉獵Matlab的圖像處理,並不熟悉這方面的函數,所以我自己寫了一個Function對圖片進行選取,如果有更好的建議,歡迎指正。其中實現的邏輯是:

nn

1) 使用rgb2gray函數對圖片進行灰度化

nn

I=imread(Pic.png);

nn

I1=rgb2gray(I);

nn

2) 將圖形中所有點與閾值進行比較,高於該閾值的點賦值255,具象方面的效果就是打白底

nn

3) 分離出圖形中每個獨立的圖像,如果圖像面積超過整個圖片面積的50%,就認為是曲線區域,將其獨立提出出來

nn

3 刪除邊框

nn

這一步實現的功能是,刪除曲線區域的外部邊框。

nn

在這一步處理過程中,首先要對圖形進行二值化處理,其中涉及到的函數是im2bw

nn

I2=im2bw(I1);

nn

裡面計算的邏輯比較簡單,就是檢測邊框黑白。

nn

4 刪除網格

nn

這一步實現的功能是,刪除圖形中的網格。裡面計算的邏輯是,查看每行每列的黑點比例,如果高於一定閾值,認為這是一條網格線,並置白。其中需要注意的一個細節是,如何防止誤刪,因為曲線必然與網格線有交點。

nn

這裡我又加入了限制條件,其中的邏輯是,以行網格線為例,如果該行網格線的列向上下五點距離內,黑點比較超過某一閾值,就認為該點為網格線與曲線的一個交點,不置白。

nn

5 刪除雜點

nn

這一步實現的功能是,刪除曲線以外的其他雜點。其中使用了三種計算邏輯:

nn

1) 與第二步所使用的方法一致,選取整個圖形中面積最大的主要圖形

nn

2) 構建一個一定大小的框,對整個圖形進行歷遍,邊框均為白色,表示邊框中的圖形為獨立獨行,可刪除,置白

nn

3) 檢驗每行每列,查看是否有分段的黑色區間,並進行取捨。這個邏輯中可以考慮將行向量或是列向量轉成字元串的形式進行篩選處理。

nn

6 數據導出

nn

這一步中就是常規的數據處理,選取圖形中的黑點,在同一個列的點對行數求均值,最終形成整個曲線的數據矩陣,並通過xlswrite函數將數據舉證保存到excel中

nn

7 生成新的曲線

nn

這一步就是將數據處理後的曲線數據通過plot函數以圖形的形式呈現

nn

8 自動處理

nn

以上整個過程都是手動處理的,當然,可以將整個過程集成在一個按鈕,自動導出數據並生成新的曲線,這個效果是動圖形式,可以在我公眾號的文章中閱讀。

nn

以上

如果有興趣,可以關注我的微信公眾號「打浦橋程序員」,謝謝


推薦閱讀:

已知f(x,y)=0以及z=g(x,y),如何用matlab求(x,z)的圖像?
加速你的MATLAB開發(1): 自動生成MATLAB代碼

TAG:MATLAB |