利用OpenCV檢測圖像中的長方形畫布或紙張并提取圖像內(nèi)容_第1頁
利用OpenCV檢測圖像中的長方形畫布或紙張并提取圖像內(nèi)容_第2頁
利用OpenCV檢測圖像中的長方形畫布或紙張并提取圖像內(nèi)容_第3頁
利用OpenCV檢測圖像中的長方形畫布或紙張并提取圖像內(nèi)容_第4頁
利用OpenCV檢測圖像中的長方形畫布或紙張并提取圖像內(nèi)容_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、問題如下:也就是在一張照片里,已知有個長方形的物體,但是經(jīng)過了透視投影,已經(jīng)不再是規(guī)則的長方形,那么如何提取這個圖形里的內(nèi)容呢?這是個很常見的場景,比如在博物館里看到一幅很喜歡的畫,用手機(jī)找了下來,可是回家一看歪歪斜斜,腦補(bǔ)原畫內(nèi)容又覺得不對,那么就需要算法輔助來從原圖里提取原來的內(nèi)容了。不妨把應(yīng)用的場景分為以下:紙張四角的坐標(biāo)(圖中紅點(diǎn))已知的情況也就是上面的左圖中4個紅點(diǎn)是可以準(zhǔn)確獲取,比如手動標(biāo)注,那么就簡單了:用OpenCV的Perspective Transform就可以。具體步驟如下:1) 將標(biāo)注好的四個點(diǎn)坐標(biāo)存入一個叫corner的變量里,比如上面的例子中,原圖的分辨率是300x

2、400,定義x和y的方向如下:那么紙張的四角對應(yīng)的坐標(biāo)分別是:左上:157.6, 71.5右上:295.6, 118.4   右下:172.4, 311.3   左下:2.4, 202.4 把這四個坐標(biāo)按如上順序放到一個叫corner的變量里。如果我們打算把這幅圖案恢復(fù)到一個300x400的圖像里,那么按照對應(yīng)的順序把下面四個坐標(biāo)放到一個叫canvas的變量里:左上:0, 0右上:300, 0右下:300, 400   左下:0, 400 假設(shè)原圖已經(jīng)用OpenCV讀取到一個叫imag

3、e的變量里,那么提取紙張圖案的代碼如下:1 M = cv2.getPerspectiveTransform(corners, canvas)2 result = cv2.warpPerspective(image, M, (0, 0)把左圖剪裁出來,去掉紅點(diǎn)后試了試,結(jié)果如下:當(dāng)然,其實(shí)這一步用Photoshop就可以了。紙張四角的坐標(biāo)未知或難以準(zhǔn)確標(biāo)注的情況這種場景可能是小屏幕應(yīng)用,或是原始圖像就很小,比如我這里用的這個300x400例子,點(diǎn)坐標(biāo)很難精確標(biāo)注。這種情況下一個思路是,用邊緣檢測提取紙張四邊,然后求出四角坐標(biāo),再做Perspective Transform。 1) 圖像

4、預(yù)處理一般而言即使做普通的邊緣檢測也需要提前對圖像進(jìn)行降噪避免誤測,比如最常見的辦法是先對圖像進(jìn)行高斯濾波,然而這樣也會導(dǎo)致圖像變得模糊,當(dāng)待檢測圖形邊緣不明顯,或是圖像本身分辨率不高的情況下(比如本文用的例子),會在降噪的同時(shí)把待檢測的邊緣強(qiáng)度也給犧牲了。具體到本文的例子,紙張是白色,背景是淺黃帶紋路,如果進(jìn)行高斯濾波是顯然不行的,這時(shí)候一個替代方案是可以考慮使用Mean Shift,Mean Shift的優(yōu)點(diǎn)就在于如果是像背景桌面的淺色紋理,圖像分割的過程中相當(dāng)于將這些小的浮動過濾掉,并且保留相對明顯的紙張邊緣,結(jié)果如下:原圖處理后Meanshift的代碼:1 image = cv2.py

5、rMeanShiftFiltering(image, 25, 10)因?yàn)橹饕康氖穷A(yù)處理降噪,windows size和color distance都不用太大,避免浪費(fèi)計(jì)算時(shí)間還有過度降噪。降噪后可以看到桌面上的紋理都被抹去了,紙張邊緣附近干凈了很多。然而這還遠(yuǎn)遠(yuǎn)不夠,圖案本身,和圖像里的其他物體都有很多明顯的邊緣,而且都是直線邊緣。2) 紙張邊緣檢測雖然降噪了,可是圖像里還是有很多邊緣明顯的元素。怎么盡量只保留紙張的邊緣呢,這時(shí)候可以考慮用分割算法,把圖像分為紙張部分和其他部分,這樣分割的mask邊緣就和紙張邊緣應(yīng)該是差不多重合的。在這里可以考慮用GrabCut,這樣對于簡單的情況,比如紙張

6、或畫布和背景對比強(qiáng)烈的,直接把圖像邊緣的像素作為bounding box就可以實(shí)現(xiàn)自動分割。當(dāng)自動分割不精確的情況下再引入手動輔助分割,具體到我這里用的例子,背景和畫面接近,所以需要手動輔助:結(jié)果如下:可以看到,分割后的結(jié)果雖然能基本區(qū)分紙張形狀了,可是邊緣并不準(zhǔn)確,另外鍵盤和部分桌面沒能區(qū)分開來。這時(shí)可以繼續(xù)用GrabCut+手動標(biāo)注得到只有紙張的分割?;蛘邽榱擞脩粲押玫脑挘M量少引入手動輔助,那么可以考慮先繼續(xù)到下一步檢測邊緣,再做后期處理。假設(shè)我們考慮后者,那么我們得到的是如下的mask:這個mask并不精確,所以不能直接用于邊緣檢測,但是它大致標(biāo)出了圖片里最明顯的邊緣位置所在,所以可以

7、考慮下面的思路:保留降噪后位于mask邊緣附近的信息用于真正的邊緣檢測,而把其他部分都模糊處理,也就是說基于上面得到的mask做出下面的mask用于模糊處理:基于這個mask得到的用于邊緣檢測的圖像如下:用canny算子檢測出邊緣如下:3) 直線檢測對檢測到的邊緣使用Hough變換檢測直線,我例子里用的是cv2.HoughLinesP,分辨率1像素和1°,可以根據(jù)圖像大小設(shè)置檢測的閾值和minLineLength去除大部分誤檢測。特別提一下的是如果使用OpenCV的Python binding,OpenCV 2和OpenCV 3的結(jié)果結(jié)構(gòu)是不一樣的,如果進(jìn)行代碼移植需要相應(yīng)的修改。檢

8、測到的結(jié)果如下:可以看到,有些線幾乎重合在一起了,這是難以避免的,上圖中一共檢測到9條線,其中兩對(下、右邊緣)重合。可以通過距離判斷和直線相對角度來判斷并把重合線段合為一條:剩下的都是沒有重合的線了。4) 判斷紙張邊緣那么如何選取紙張邊緣的四條線呢(即使圖像分割步驟非常好得分開了紙張和其他部分,這在有些情況下還是難以避免的,比如圖案里有和邊緣平行的線條),可以沿著提取線段的兩邊采樣像素的灰度:在線段的兩個端點(diǎn)之間平均采樣左右兩邊像素的值,因?yàn)橐话銇碚f如果是紙張或者畫布,邊緣和背景的顏色在四邊上應(yīng)該都是類似的。然而這樣做的話引入另外一個問題是需要區(qū)分線段的“左”和“右”,對于線段本身而言就是要

9、區(qū)分前后。所以需要對畫面里所有的線段端點(diǎn)進(jìn)行排序,而這個排序的基準(zhǔn)就是相對畫布。具體到本文的例子就是把圖像中心定義為所有線段的“左”邊,如上圖。而決定線段端點(diǎn)“前”和“后”可以用如下辦法:先假設(shè)線段的前后端點(diǎn),將兩個端點(diǎn)坐標(biāo)分別減去中心點(diǎn)(紅點(diǎn))的坐標(biāo),然后將得到的兩個向量a和b求叉積,如果叉積大于0則說明假設(shè)正確,如果<0則交換假設(shè)的前后端點(diǎn)。線段端點(diǎn)的順序確定后就可以進(jìn)行采樣了,簡單起見可以分別采樣左右兩側(cè)的像素灰度值,如果希望更準(zhǔn)確可以采樣RGB通道的值進(jìn)行綜合比較,下面是7條線段對應(yīng)的兩側(cè)像素灰度的中值分布:可以看到其中有4個點(diǎn)距離非常近(紅色),說明他們的像素灰度分布也很接近,把這4條選出來,結(jié)果如下:正是要的結(jié)果。5) 計(jì)算四角的坐標(biāo)接下來計(jì)算四條線的交點(diǎn),方法點(diǎn)這里。因?yàn)橛?條線,會得到6個結(jié)果,因?yàn)樵谶@種應(yīng)用場景中,方形的物體在透視變換下不會出現(xiàn)凹角,所以直接舍棄離紙張中心最遠(yuǎn)的兩個交點(diǎn)就得到了四個角的坐標(biāo),結(jié)果如下:這樣就回到了一開始四角坐標(biāo)已經(jīng)得到的情況,直接進(jìn)行透視變換就行了。Camera Calibration?寫了這么多,其實(shí)有一條至關(guān)重要的假設(shè),甚至可以說是最關(guān)鍵的步驟之一我一直沒提,那就是Camera Calibration,如果有相機(jī)的情況下,meta data都知道,那么需要先坐Came

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論