一个简单的验证码识别教程
一、起因
前幾天準備做一個自動計算gpa的網站,學校的教務登錄時候需要輸入驗證碼。本來想把驗證碼圖片顯示出來讓用戶手動輸入,但是搞了半天沒搞定。。。所以決定自己寫一個識別的程序。
直接說結果吧,最終寫好的程序成功率100%(連續測試了200次)。
二、原理
我們先來看一看驗證碼是什么樣的。
如上如,就是這樣的一個四位數字。
這樣的驗證碼已經可以算是驗證碼界最簡單的了,沒有任何扭曲、變形、干擾線,長著一張“快來識別我!”的臉。那我們就來識別一下吧。
原理很簡單,就是通過計算圖片相似度來判斷。
三、準備工作
準備工作主要做兩點,截取數字和計算坐標。
截取數字就是把0~9這十個數字從驗證碼圖片中截取出來,方便后面對比用。需要注意的是,十個數字最好尺寸相同。我是用ps截的,因為這個網站已經做完一段時間了,我就不重新截圖了。
計算坐標主要是要確定第一個數字左上角的坐標。因為我們截的數字都是同樣尺寸,所以只要確定了第一個數字左上角的坐標就可以算出后面三個數字的坐標了。坐標的計算也是用ps,放大圖片之后數一數就行了。。別眼花就肯定能數對
四、代碼部分
代碼部分,我只給出最關鍵的相似度計算。我使用的是python。
def hamming_dist(hash1, hash2):return sum(itertools.imap(operator.ne, hash1, hash2))def get_hash(img):image = img.resize((9, 13), Image.ANTIALIAS).convert("L")pixels = list(image.getdata())avg = sum(pixels) / len(pixels)return "".join(map(lambda p: "1" if p > avg else "0", pixels))?get_hash()函數是計算圖片的hash值。是把單個像素和平均像素比較,如果大就賦1,如果小就賦0。這樣就把一個圖片轉換成一個二進制串了。
hamming_dist()函數是計算兩個二進制串的漢明距離。不明白的可以百度一下,很簡單的。
有了這兩個函數,我們就可以進行識別了。首先從網頁獲取驗證碼圖片,然后根據坐標以及尺寸從圖片中截取出來四個未知數字,然后每個未知數字都和我們的十個標準數字進行對比,最后取相似度最大,也就是漢明距離最小的那個標準數字。這樣就可以判斷出來四個數字了。
五、意外之外
實際操作中,我發現識別成功率很低。為什么呢?我保存識別失敗的圖片進行查看,發現這個驗證碼有一個特點,就是如果里面出現1的時候,兩個數字間的距離就會縮短。這也就意味著我們之前計算的坐標是錯的。怎么辦呢?我想了一會,發現有1的時候一般坐標會向后移動2~3格,那就好辦了,我們先按照默認坐標算一次,然后給他+1再算一次,然后+2.。。最后我們取相似度最大的就行了。
雖然不是最好的解決辦法,但是很實用,畢竟是計算機,多算個幾次完全沒有問題。
最后我決定把最大偏移設置為3,并且考慮到1的位置不固定,我每次計算的時候都會嘗試偏移0~3,也就是一個圖片計算次數為4(4個數字)*4(0~3一共4次嘗試)*10(10個標準數字)。大概就是這樣。
六、結論
這次的驗證碼識別可以說簡單當中有一點不簡單,解決問題的能力還是很重要的。
轉載于:https://www.cnblogs.com/numbbbbb/p/3230523.html
總結
以上是生活随笔為你收集整理的一个简单的验证码识别教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用msm文件创建msi
- 下一篇: first Day