天天看點

Python應用(一) 識别網站驗證碼以及識别算法

00 識别涉及技術

驗證碼識别涉及很多方面的内容。入手難度大,但是入手後,可拓展性又非常廣泛,可玩性極強,成就感也很足。

驗證碼圖像處理

驗證碼圖像識别技術主要是操作圖檔内的像素點,通過對圖檔的像素點進行一系列的操作,最後輸出驗證碼圖像内的每個字元的文本矩陣。

1.讀取圖檔

2.圖檔降噪

3.圖檔切割

4.圖像文本輸出

驗證字元識别

驗證碼内的字元識别主要以機器學習的分類算法來完成,目前我所利用的字元識别的算法為KNN(K鄰近算法)和SVM (支援向量機算法),後面我 會對這兩個算法的适用場景進行較長的描述。

1.擷取字元矩陣

2.矩陣進入分類算法

3.輸出結果

涉及的Python庫

這次研究主要使用了以下這三個庫

1.numpy(數學處理庫)

2.Image(圖像處理庫)

3.ImageEnhance(圖像處理庫)

驗證碼識别技術難點

驗證碼識别由兩部分組成,分别是驗證碼圖檔處理和驗證碼字元學習。

在編碼過程中,我認為難度最大的部分是識别算法的學習和使用。

在寫文檔的時候,我認為難度最大的部分是圖像處理部分,圖像處理部分需要對抗各種幹擾因素,對抗不同類型的驗證碼需要不同的算法支援,是以圖像處理程式需要對各種驗證碼具體問題具體分析,不能抱有大而全的思想,務必注重細節處理。

01 學習與識别

驗證碼識别的過程分為學習過程與識别過程

學習

Python應用(一) 識别網站驗證碼以及識别算法

識别

Python應用(一) 識别網站驗證碼以及識别算法
Python應用(一) 識别網站驗證碼以及識别算法

上圖代碼運用的是SVM的識别過程

02 圖像處理

驗證碼圖像處理腦圖

Python應用(一) 識别網站驗證碼以及識别算法

如上圖所示,驗證碼圖像處理子產品是一個結構規整、内部分支複雜的子產品,整個驗證碼識别準确率全靠這個子產品,可謂是整個驗證碼識别的根本。如 上文所說,圖像處理子產品玩的是圖檔内的每一個像素百度百科:像素,是以這個子產品好上手。

Python應用(一) 識别網站驗證碼以及識别算法

上面這兩句便可以打開一個圖像對象,im對象内置許多方法有興趣可以檢視Image庫源碼或者參考Python Imaging Library Handbook 圖檔增加對比度、銳化、調整亮度、二值化,這四塊是比較規整的子產品,處理調用庫函數即可。下面主要說說圖檔降噪和清楚單像素幹擾線。

圖檔清除噪點

圖檔降噪的原理是利用9宮格内資訊點(資訊像素,一般經過預處理的資訊像素為黑色)。

Python應用(一) 識别網站驗證碼以及識别算法

上圖黑色部分為(x,y),單像素噪點處理時分别驗證周圍的八個點是否為白色,如果為白色即可判斷(x,y)為噪點。同理雙像素噪點需要考慮兩個像 素的排列是橫向還是縱向或者是斜向,之後判斷其周圍10個像素是否均為白色像素即可。同理三像素噪點也是這樣,我嘗試的情況三像素噪點不包括 橫向排列和縱向排列。

圖檔清除幹擾線

對于單像素的幹擾線目前可以解決,但是大寬度幹擾線則會産生判斷上的誤差,目前不好解決。

Python應用(一) 識别網站驗證碼以及識别算法

上圖的幹擾線為單像素,是以通過算法即可解決。

Python應用(一) 識别網站驗證碼以及識别算法

幹擾線處理後的圖檔如上圖所示。

圖檔切割

對于去噪後的圖檔,我們需要對圖檔進行切割,切割的目的是為了提取資訊,友善把圖檔中的數字轉化為01形式的文本。 我所采用的切割方式是投影法.

Python應用(一) 識别網站驗證碼以及識别算法

如上圖所示,對于切割數字3,首先需要找到垂線A和B,判斷步驟是:縱向從左向右掃描圖檔,找到第一條含有資訊點的直線記為A,繼續向右掃描, 當從A開始,找到第一條無資訊點的直線記為B,從投影的角度來看,A與B之間X軸上的投影的資訊值均大于0,切割A與B之間的圖像後,以新圖像為 基礎,找出C與D,至此便可切割出數字3。

圖檔切割目前可以僅可對非粘連字元進行切割,對于粘連字元,我的程式并沒能很好的處理。

資訊輸出

當擷取了切割好的圖檔,由于圖檔隻有黑色與白色,是以周遊每一個像素點,根據像素點的顔色來進行0,1輸出,一般認為黑色像素輸出1,白色像素 輸出0。

Python應用(一) 識别網站驗證碼以及識别算法

03 識别算法概述

字元識别算法整體流程很好了解,舉個例子,字元像素文本A進入識别算法,通過對算法的結果進行判斷,便可以完成識别過程。我實踐了兩種識别算 法,第一種是KNN算法,第二種是SVM算法,下面我将以個人的角度來闡述下這兩種算法的原理以及适用場景,個人水準有限,算法細節可以參考我 之後給出的連結。

KNN(K鄰近算法)

KNN算法是一種簡單的算法,KNN算法基本思想是把資料轉化為點,通過計算兩點之間的距離來進行判斷。 在n次元下,兩點間距離可以表示為 S = math.sqrt((x1-y1)^2+(x2-y2)^2+.+(xn-yn)^2)。

SVM(支援向量機)

SVM算法相比較KNN算法來說,原理上要複雜複雜的多,SVM算法基本思想是把資料轉化為點,通過把點映射到n維空間上,通過n-1維的超平面 切割,找到最佳切割超平面,通過判斷點在超平面的哪一邊,來判斷點屬于哪一類字元。

Python應用(一) 識别網站驗證碼以及識别算法

但是SVM算法的特點隻能在兩類中間比較,是以把字元識别運用到該算法上,還需要在比較過程中加以一個周遊算法,周遊算法可以減少大量無效計 算,周遊的場景是一個有向無環圖。

算法細節文檔連結

jerrylead 的blog : Machine Learning

支援向量機通俗導論(了解SVM的三層境界)

0x04 識别算法适用場景

KNN與SVM的适用場景存在一定差別。

KNN算法在運作過程上來說,并不存在學習過程,隻是周遊已知分類進行距離上的判斷,根據待測資料與已知分類進行比較,找出與待測距離最近的n個資料來進行比對,是以當已分類的樣本越來越多,KNN算法的運算時間會越來越長。

SVM算法在運作過程中,是存在學習的過程的,通過對已知分類标簽進行兩兩組合,找出每個組合的切割方程。待測資料隻需要一個一個計算切割方程,根據切割方程的傳回值來判斷下一個執行的是哪個方程即可。0-9數字的判斷,隻需要執行9次方程計算即可。SVM多類分類方法

是以如果大規模識别驗證碼,我建議适用SVM作為識别算法。

04 實踐細節注意事項

這部分内容是我所遇到的問題。

規則化圖像

當切割的驗證碼以數字呈現在文本裡,他們的像素是各不相同的,需要把這些标準化,我選擇标準化在27*30像素是一個經驗值。此外,還需要把新圖 像放置在标準化像素的正中央。

Python應用(一) 識别網站驗證碼以及識别算法

使用SVM建構超平面方程

SVM算法的重點是尋找切割方程,首先需要把待判斷的兩種元素存入到dataArr和labelArr中,通smoP方程尋找b和alphas。

Python應用(一) 識别網站驗證碼以及識别算法

利用方程組預測——周遊dag圖

由于svm是二分類器,隻能判斷是或者不是,隻需要使用k一1個決策函數即可得出結果,不存在誤分、拒分區域;另外,由于其特殊的結構,故有一定的容錯性,分類精度較一般的二叉樹方法高。

對于0123456789 共10個字元 共有45種非重複組合。利用dag隻需判斷9次即可找出目标。

Python應用(一) 識别網站驗證碼以及識别算法

05 實踐總結

運用機器學習算法時,如果不了解實作原理,先直接套接口,總之先實作功能,不必強求對算法的徹底了解。 2. 識别算法是通用的。

處理不同驗證碼,應該有不同的處理政策。

測試發現,主要耗時發生在建構方程過程中,建構方程耗時105s,識别1s。

圖像去噪時對于大寬度的幹擾線沒有好的解決辦法(幹擾線寬度大于3像素)。 6. 圖像切割在面臨圖像粘連時,目前無很好的處理方法。

原文出處:http://drops.wooyun.org/tips/6313