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