opencv4android開發記錄(2):簡單文字檢測

       本文將和大家分享一種簡單的文字檢測算法,算法不復雜,所以就不是萬能的,不能檢測某些情況下的文字,至於爲什麼,讀到下面自然知道。由於本文主要分享的是思路,具體的實現方法不做過多解釋,如果文中提到的一些圖像處理方法不懂的話自行學習,網上有很多解答,我這裏未必能講清楚,所以希望自行學習。本文最後會提供免費源碼下載,供大家學習討論,同時代碼不一定完善,大家發現的話,希望提出寶貴意見,如有問題可留言討論。

       (一) 檢測思路

         本文方法主要針對網頁截圖或類似的圖片文字提取。這類圖片中的文字主要有兩個特點:邊緣信息較多和文字區域高度在一定範圍(往往該範圍之外的邊緣信息較多的區域爲圖片)。本文方法主要通過這兩個特點實現文字提取。思路大概是將邊緣信息體現到像素值上,對像素值統計確定可能的文字區域,然後將圖片區域剔除,剩下的區域就是文字區域了。 

       (二)方法步驟

       1、邊緣信息體現到像素上

       提到邊緣信息,自然就想到邊緣提取算法,相信很多人都知道很多種方法了,這裏就不多做解釋。關鍵提取完邊緣該怎麼做才能用像素值體現出邊緣信息呢?這裏提供一種方法,先二值化邊緣提取的圖像,再通過膨脹腐蝕來完成。如果不清楚圖像的膨脹腐蝕,請自行學習,此處不作講解。之後得到一幅可以用非零像素體現邊緣信息的圖像。其實邊緣提取之後的圖像也可以體現,但是查看邊緣提取的圖片,很容易發現文字區域的非零像素值比較少,文字與文字之間分開,不利於後續處理,所以需要膨脹腐蝕。 

       2、提取可能的文字區域

      上面得到的圖像中,文字區域呈現出大量非零像素,而文字區域一般是矩形,我們需要確定矩形的上下左右邊界就能確定一個可能的文字區域了。對某一行的非零像素值統計,如果大於一個閾值就認爲有文字,因爲文字有豐富的邊緣信息,步驟1將這一信息體現在非零像素值,所以此處統計非零像素值,這樣就可以確定文字區域的上下邊界。同理,在得出一個上下邊界的區域之後,對該區域的縱向統計非零像素,得左右邊界。用此方法就可以提取提取整個圖像中文字的可能區域。注意,這裏查找可能的區域是橫向和縱向,如果文字是斜的,那麼查找的區域與真實區域存在誤差,後面去除圖片區域的時候就有可能去掉這個區域,所以這個文字提取方法不能提取斜着的文字。

      3、去除圖片區域

       通過以上介紹,可以知道去除圖片區域是根據文字的高和寬在一定範圍內實現。因此對上一步得到的所有區域計算其高度和,如果過大或過小就丟掉該區域,文字寬度可以佔據整幅圖片。所以此處一般不對文字區域寬度做最大限定,只是限定其最小值。

       好了,大概就這些了。總結一下,首先圖像提取輪廓,膨脹腐蝕,然後通過統計非零像素得到可能的文字區域,再根據文字寬和高的限制篩選,剔除圖像區域。看一下結果:


       這裏再說一下,對大圖像運算時,如果直接在UI線程運行的話界面會卡死,很不爽,因此我將運算部分放到async task裏執行(不懂的同學可以自行學習),然後加了一個進度條顯示進度,並且圖像的高度和寬度可以輸入,界面醜了點,但是學習文字提取的方法是可以用了的。最後說一下自己學習該方法是在百度文庫中的一篇文章中學到的,百度matlab檢測文字應該可以找到,此處通過學習他的matlab,瞭解核心方法,用opencv4android實現。當然,還有很多種文字檢測的方法,後續有時間會陸續更新,之後也會記錄一些文字識別和人臉檢測和識別等方法,希望感興趣的同學可以一起學習交流,如有大牛能對本文方法存在的錯誤進行指正,我將感激不盡。

       附上相關程序下載地址:https://github.com/kmin0579/CharDetect.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章