Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

前言叨B叨

我不知道有多少同學知道沃貝,用聯通的同學也不見得都知道, 因為我也是後來別人科普給我才知道聯通旗下有這麼個網站, 每天簽到,一個月到頭可以得950M流量. 對於我這種14塊月租套餐的用戶來說,還是很不錯的福利. 但是, 問題來了, 每天簽到, 很煩躁的說, 於是就想著做個自動簽到, 順便以 python 機器學習 的名義, 廢話路上說, 來不及了, 快上車!

如下圖所示, 驗證碼識別一般分為如下幾個步驟, 今天我們主要說下紅框部分, 圖像採集和處理.

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

一. 採集圖像

  1. 先去到網站上的登錄窗口, 找到二維碼的地址, 然後寫個循環把圖片下載下來做樣本, 多多益善,我這隻下了50張.

    Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

    Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

  2. 在截圖中可以看到, 這個驗證碼還不是個一般的驗證碼, 是個二般的. 特徵為: 純數字, 字體有旋轉, 背景有雜色, 還有干擾線. 所有這些特徵, 除了純數字以外, 全部是來阻止程序自動識別的絆腳石. 接下來, 我們就來一步一步地掃清障礙, 還我4個清純的數字s.

二.圖像處理

  1. 處理圖像之前, 先把pillow裝上:

pip install pillow

2. 首先來灰度化,二值化, 就是把背景雜色過濾掉變得非黑即白.這裡的閾值設置的是170, 可根據不同的驗證碼設置不同的值.

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

然後圖像會變成這樣:

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

3. 接下來去噪. 這個去噪不比ps裡, 用橡皮擦擦就沒了, 裡面還是有些門道(算法)的. 比如[鄰域像素算法]:

即對於像素值>245的鄰域像素,判別為屬於背景色,如果一個像素上下左右4各像素值有超過2個像素屬於背景色,那麼該像素就是噪聲。這裡還需要考慮到邊界問題.

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

去噪後, 效果如下圖. 對於以上鄰域算法僅僅是針對像素為1的干擾線, 對於像素大於一的干擾線沒做處理. 不過這個對於機器學習的話問題不大, 因為我們最後生成的樣本會有很多種類, 然後讓程序去推測當前識別的對象的可信度.

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

4. 接下來應該是切割驗證碼(開始那個流程圖感覺不太對, 應該是先分割後再校正傾斜度)

切割驗證碼用的是投影算法, 即座標從上到下, 從左到右遍歷, 如果發現是空白,就跳過,直到掃描到像素值為255的點,開始輸出, 輸出到縱座標上沒有像素值為255的點,如下圖所示:

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

相關代碼呢, 太長了, 貼上來估計你也不願意看. 我在後面把所有代碼上傳到GitHub(地址附在文章底部), 大家有興趣就down下來研究研究.

5. 校正傾斜度, 然後重新調整大小. 校正傾斜度這裡用的是旋轉卡殼算法, 如下圖所示, 當兩條平行線之間的舉例最短的時候, 就認為是字符正確的方向.

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

代碼如下:

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

這裡在旋轉的時候是從-60度到60度, 是依據當前驗證碼傾斜規律設定的. 調整完後效果如圖. 可以發現有些字符並不是很正, 但是將就吧

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

其實如果是用機器學習的去識別字符的話, 校正傾斜度可做可不做, 因為機器學習是靠大量樣本來對比識別的, 如果你的歪歪扭扭的樣本足夠多, 一樣可以識別.

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')

最後整理完揍是這個樣子

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

結語

至此, 識別驗證碼的第一部分港完了, 得到了一堆小小的數字圖片.

後面將會進一步講講驗證碼識別部分. 敬請期待.

說好的GitHub鏈接

https://github.com/shark526/WowSign

參考鏈接:

Python 機器學習 識別驗證碼 來個'沃貝'自動簽到(1: 圖像處理)

抱歉此處用了截圖, 因為太多鏈接會被和諧,文章都發布不了

相關推薦

推薦中...