python腳本實現(xiàn)驗證碼識別
最近在折騰驗證碼識別。最終的腳本的識別率在92%左右,9000張驗證碼大概能識別出八千三四百張左右。好吧,其實是驗證碼太簡單。下面就是要識別的驗證碼。

我主要用的是Python中的PIL庫。
首先進(jìn)行二值化處理。由于圖片中的噪點顏色比較淺,所以可以設(shè)定一個閾值直接過濾掉。這里我設(shè)置的閾值是150,像素大于150的賦值為1,小于的賦為0.
def set_table(a):
table = []
for i in range(256):
if i < a:
table.append(0)
else:
table.append(1)
return table
img = Image.open("D:/python/單個字體/A"+str(i)+".jpg")
pix = img.load()
#將圖片進(jìn)行灰度化處理
img1 = img.convert('L')
#閾值為150,參數(shù)為1,將圖片進(jìn)行二值化處理
img2 = img1.point(set_table(150),'1')
處理后的圖片如下。

閾值不同產(chǎn)生的不同效果:

接下來對圖片進(jìn)行分割。遍歷圖片中所有像素點,計算每一列像素為0的點的個數(shù)(jd)。對于相鄰兩列,若其中一列jd=0,而另一列jd!=0,則可以認(rèn)為這一列是驗證碼中字符邊界,由此對驗證碼進(jìn)行分割。這樣分割能達(dá)到比較好的效果,分割后得到的字符圖片幾乎能與模板完全相同。
(Width,Height) = img2.size
pix2 = img2.load()
x0 = []
y0 = []
for x in range(1,Width):
jd = 0
# print x
for y in range(1,Height):
# print y
if pix2[x,y] == 0:
jd+=1
y0.append(jd)
if jd > 0:
x0.append(x)
#分別對各個字符邊界進(jìn)行判斷,這里只舉出一個
for a in range(1,Width):
if (y0[a] != 0)&(y0[a+1] != 0):
sta1 = a+1
break
分割完成后,對于識別,目前有幾種方法。可以遍歷圖片的每一個像素點,獲取像素值,得到一個字符串,將該字符串與模板的字符串進(jìn)行比較,計算漢明距離或者編輯距離(即兩個字符串的差異度),可用Python-Levenshtein庫來實現(xiàn)。
我采用的是比較特征向量來進(jìn)行識別的。首先設(shè)定了4個豎直特征向量,分別計算第0、2、4、6列每一列像素值為0的點的個數(shù),與模板進(jìn)行比較,若小于閾值則認(rèn)為該字符與模板相同。為了提高識別率,如果通過豎直特征向量未能識別成功,引入水平特征向量繼續(xù)識別,原理與豎直特征向量相同。
另外,還可以通過局部特征進(jìn)行識別。這對于加入了旋轉(zhuǎn)干擾的驗證碼有很好效果。由于我寫的腳本識別率已經(jīng)達(dá)到了要求,所以并沒有用到這個。
最后的結(jié)果是這樣的:

最終在模板庫只有25條的情況下,識別率在92%左右(總共測試了一萬六千張驗證碼)。好吧,只能說驗證碼太簡單。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python argparse命令參數(shù)與config配置參數(shù)示例深入詳解
這篇文章主要介紹了Python argparse命令參數(shù)與config配置參數(shù),argparse是Python內(nèi)置的一個用于命令項選項與參數(shù)解析的模塊,通過在程序中定義好我們需要的參數(shù),然后在程序啟動命令行傳遞我們想要改變的參數(shù)2023-03-03
python中使用you-get庫批量在線下載bilibili視頻的教程
這篇文章主要介紹了使用python中you-get庫批量在線下載bilibili視頻的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
基于python實現(xiàn)Pycharm斷點調(diào)試
這篇文章主要介紹了基于python實現(xiàn)Pycharm斷點調(diào)試,在我們寫程序的時候,很容易遇到各種各樣的bug,然后編譯器提示程序出錯的地方。很多時候可以通過提示的信息修改程序,但是有時我們想得到更多的信息,這個時候就需要進(jìn)行斷點調(diào)試,下面我們就一起來學(xué)習(xí)ycharm斷點調(diào)試2022-02-02
Python無權(quán)點文件轉(zhuǎn)化成鄰接矩陣方式
這篇文章主要介紹了Python無權(quán)點文件轉(zhuǎn)化成鄰接矩陣方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Python簡單檢測文本類型的2種方法【基于文件頭及cchardet庫】
這篇文章主要介紹了Python簡單檢測文本類型的方法,結(jié)合實例形式分析了基于基于文件頭及cchardet庫兩種文本類型檢測的方法,需要的朋友可以參考下2016-09-09

