基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)

同事讓我?guī)兔μ幚硪恍﹫D片曲線,把圖片里的曲線坐標(biāo)搞出來。

我后悔以前不該亂吹牛。我之前確實(shí)搞過一個(gè)這樣的程序,只不過那個(gè)程序更像一個(gè)探索性的東西,用起來限制很多,稍顯雞肋。

我當(dāng)時(shí)的程序,需要先經(jīng)過3個(gè)步驟的準(zhǔn)備,才能開始程序識(shí)別坐標(biāo)。大概的步驟如下:

1.jpg

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖2

 Step1. 清場(chǎng)。如果一個(gè)圖里有很多曲線,要把其他曲線清掉(畫圖板);

Step2. 斷點(diǎn)。如果曲線是連續(xù)的,則要把他們分成一個(gè)個(gè)小段(圖板go on);

Step3. 定參考點(diǎn)。圖像初步識(shí)別的時(shí)候,是沒有坐標(biāo)基準(zhǔn)的,要在原圖里放兩個(gè)知道坐標(biāo)的點(diǎn),用于基準(zhǔn)定義;

Step4. 程序運(yùn)行。程序識(shí)別出每一個(gè)斷點(diǎn)的中心位置坐標(biāo)。

我大概嘗試下,這個(gè)流程走下來和直接用線程的GetData軟件結(jié)果差不多。上面幾個(gè)步驟里面,前兩個(gè)步驟耗時(shí)比較長(zhǎng)。

前年冬天在哈爾濱出差的時(shí)候,我對(duì)step1和step2嘗試過自動(dòng)化的方法。當(dāng)時(shí)我的方法是這樣的:

1)針對(duì)step1。我搞出了顏色識(shí)別算法,對(duì)于一個(gè)圖好多個(gè)顏色的線,能夠做到提取特定顏色;

2)針對(duì)step2。我的設(shè)想是,自動(dòng)在圖里畫出白色的豎線或者橫線,做到對(duì)現(xiàn)有曲線的自動(dòng)分割。

嘗試之后,step2的改進(jìn)失敗。這是因?yàn)椋绻划嫏M線或者豎線再或者同時(shí)畫,如果線定的太密,原有曲線被遮擋嚴(yán)重,丟失信息。如果畫的太稀疏,則搞得精度不夠。這個(gè)度對(duì)于不同的圖,很難有統(tǒng)一的設(shè)定,因此實(shí)際用起來意義不大。

2.jpg

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖4

如果說一兩個(gè)圖,我用GetData就能很快處理了,一世英名得以保全。拿到手一看,幾十個(gè)圖,每個(gè)圖2分鐘也要搞兩三個(gè)小時(shí)。兩三個(gè)小時(shí)的重復(fù)取點(diǎn)工作,光想想,我就覺得自己眼睛會(huì)瞎。

我決定砍柴之前再磨一次刀,嘗試解決兩年前的問題。

1 Step2的解決

實(shí)際上,我仔細(xì)想了下,之所以出現(xiàn)step2斷點(diǎn)操作,主要是我之前的程序里要識(shí)別一個(gè)封閉區(qū)域的中心點(diǎn),如果曲線連在一起,那么只能得到一個(gè)點(diǎn)。

3.jpg

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖6這段程序是我從網(wǎng)上看來的,囫圇吞棗的用了,其實(shí)沒仔細(xì)考慮過。

如果從圖片的構(gòu)成來考慮,我一個(gè)圖是用像素點(diǎn)拼起來的,我能不能仔細(xì)去一個(gè)識(shí)別每個(gè)像素點(diǎn)的信息,進(jìn)而把構(gòu)成曲線的像素點(diǎn)識(shí)別出來呢?

看了下圖片讀取后的信息,二值化以后的圖片信息是一個(gè)m*n的矩陣,這個(gè)矩陣每個(gè)點(diǎn)的值要么是1要么是0。我把是的區(qū)域顯示出來,果然發(fā)現(xiàn)它就是我要的那個(gè)曲線。就這樣,step2被解決了。

 

4.png

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖8基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖9

5.png

2 Step3的解決

 

現(xiàn)在我的程序可以實(shí)現(xiàn)曲線自動(dòng)提取了,但是我現(xiàn)在提取的坐標(biāo)是每個(gè)像素點(diǎn)在圖里的相對(duì)位置。比如像素點(diǎn)為100*200,那么我最后一個(gè)點(diǎn)的坐標(biāo)是(100,200)。這顯然不能直接用啊,我要知道我圖片x、y兩個(gè)方向的尺度,然后才能換算出真實(shí)的坐標(biāo)值。

我原來解決方案是,在圖里面實(shí)現(xiàn)加入A、B兩個(gè)點(diǎn),通過畫圖板畫上去。

 

按照我原來的方法,這個(gè)還要用畫圖板,有點(diǎn)麻煩,我覺得應(yīng)該可以簡(jiǎn)化。

 

要簡(jiǎn)化還是要回到圖片上來。像素點(diǎn)是均勻的,如果我知道圖片x\y兩個(gè)方向真實(shí)的長(zhǎng)度,除以兩個(gè)方向像素點(diǎn)的個(gè)數(shù)不就可以確定每個(gè)像素點(diǎn)的坐標(biāo)了嗎?

 

按照這個(gè)思路,我圖片的實(shí)際尺寸我是要實(shí)現(xiàn)知道的。但是通常圖片都有白邊界,因此,需要對(duì)圖片進(jìn)行截圖處理。

6.jpg

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖12

根據(jù)這個(gè)思路,我現(xiàn)在程序效果得到了極大的提升。

 

3 改進(jìn)后的效果

 

改進(jìn)以后,我現(xiàn)在的程序,分三步:

1)截圖。

7.png

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖14

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖15

截圖后

8.png

3)輸入圖片兩個(gè)角點(diǎn)坐標(biāo)。

4)運(yùn)行程序。

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖17

二值化結(jié)果

9.png

基于MATLAB提取圖片曲線的坐標(biāo)值(簡(jiǎn)易GetDada)的實(shí)現(xiàn)的圖19

坐標(biāo)結(jié)果

 

10.png

最后,半個(gè)小時(shí)處理完了所有圖片,一世英名得以保存。

總體來說,目前這個(gè)方法相比于GetData,速度更快,不需要手動(dòng)點(diǎn)選。另外自動(dòng)提取像素點(diǎn),所得結(jié)果更密、更準(zhǔn),是一次很好的改進(jìn)體驗(yàn)。

最后,有需要?dú)g迎通過微信公眾號(hào)聯(lián)系我們。

微信公眾號(hào):320科技工作室。

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

32
17
2