前言叨B叨
我不知道有多少同學知道沃貝,用聯通的同學也不見得都知道, 因為我也是後來別人科普給我才知道聯通旗下有這麼個網站, 每天簽到,一個月到頭可以得950M流量. 對於我這種14塊月租套餐的用戶來說,還是很不錯的福利. 但是, 問題來了, 每天簽到, 很煩躁的說, 於是就想著做個自動簽到, 順便以 python 機器學習 的名義, 廢話路上說, 來不及了, 快上車!
如下圖所示, 驗證碼識別一般分為如下幾個步驟, 今天我們主要說下紅框部分, 圖像採集和處理.
一. 採集圖像
先去到網站上的登錄窗口, 找到二維碼的地址, 然後寫個循環把圖片下載下來做樣本, 多多益善,我這隻下了50張.
在截圖中可以看到, 這個驗證碼還不是個一般的驗證碼, 是個二般的. 特徵為: 純數字, 字體有旋轉, 背景有雜色, 還有干擾線. 所有這些特徵, 除了純數字以外, 全部是來阻止程序自動識別的絆腳石. 接下來, 我們就來一步一步地掃清障礙, 還我4個清純的數字s.
二.圖像處理
處理圖像之前, 先把pillow裝上:
pip install pillow
2. 首先來灰度化,二值化, 就是把背景雜色過濾掉變得非黑即白.這裡的閾值設置的是170, 可根據不同的驗證碼設置不同的值.
然後圖像會變成這樣:
3. 接下來去噪. 這個去噪不比ps裡, 用橡皮擦擦就沒了, 裡面還是有些門道(算法)的. 比如[鄰域像素算法]:
即對於像素值>245的鄰域像素,判別為屬於背景色,如果一個像素上下左右4各像素值有超過2個像素屬於背景色,那麼該像素就是噪聲。這裡還需要考慮到邊界問題.
去噪後, 效果如下圖. 對於以上鄰域算法僅僅是針對像素為1的干擾線, 對於像素大於一的干擾線沒做處理. 不過這個對於機器學習的話問題不大, 因為我們最後生成的樣本會有很多種類, 然後讓程序去推測當前識別的對象的可信度.
4. 接下來應該是切割驗證碼(開始那個流程圖感覺不太對, 應該是先分割後再校正傾斜度)
切割驗證碼用的是投影算法, 即座標從上到下, 從左到右遍歷, 如果發現是空白,就跳過,直到掃描到像素值為255的點,開始輸出, 輸出到縱座標上沒有像素值為255的點,如下圖所示:
相關代碼呢, 太長了, 貼上來估計你也不願意看. 我在後面把所有代碼上傳到GitHub(地址附在文章底部), 大家有興趣就down下來研究研究.
5. 校正傾斜度, 然後重新調整大小. 校正傾斜度這裡用的是旋轉卡殼算法, 如下圖所示, 當兩條平行線之間的舉例最短的時候, 就認為是字符正確的方向.
代碼如下:
這裡在旋轉的時候是從-60度到60度, 是依據當前驗證碼傾斜規律設定的. 調整完後效果如圖. 可以發現有些字符並不是很正, 但是將就吧
其實如果是用機器學習的去識別字符的話, 校正傾斜度可做可不做, 因為機器學習是靠大量樣本來對比識別的, 如果你的歪歪扭扭的樣本足夠多, 一樣可以識別.
6. 歸一化. 把以上的幾個步驟寫到一個循環裡, 跑他個N遍, 這時候, 我們就有了好多好多的數字圖片, 這時苦力活來了...我們需要將每張數字圖片歸類, 在本地創建0-9十個文件夾, 將數字圖片按顯示值放入相應的文件夾裡.
其實這裡在我們校正傾斜度的時候可以先使用tesseract先識別一下數字, 然後將其存放在相應文件夾裡, 這樣可以減輕一部分工作量, 但是有時候識別的不準確,或者是無法識別, 所以還得我們手工去檢查一下.
pip install pytessearct
Pytessearct說明:
a、Python-tesseract是一個基於google's Tesseract-OCR的獨立封裝包;
b、Python-tesseract功能是識別圖片文件中文字,並作為返回參數返回識別結果;
c、Python-tesseract默認支持tiff、bmp格式圖片,只有在安裝PIL之後,才能支持jpeg、gif、png等其他圖片格式;
使用如下python 語句識別字符後,存入對應文件夾
recNum = pytesseract.image_to_string(cur_img,config='-psm 10 outputbase digits')
最後整理完揍是這個樣子
結語
至此, 識別驗證碼的第一部分港完了, 得到了一堆小小的數字圖片.
後面將會進一步講講驗證碼識別部分. 敬請期待.
說好的GitHub鏈接
https://github.com/shark526/WowSign