許多網站在進行某些操作前會要求輸入驗證碼以此來抵禦爬蟲和***。此篇主要講述如何通過代碼來識別一些常見的驗證碼。以此探究圖片識別的過程以及如何避免生成容易被識別的驗證碼。
理論
圖片識別的過程
-
取樣本
-
清洗區分樣本
-
提取樣本特徵
- 提取目標的特徵與樣本進行對比
操作過程
Java有豐富的圖片處理類,本次操作使用java語言。
一、取目標網站的驗證碼樣本。在web頁面中查看驗證碼請求的地址。通過http請求批量獲取驗證碼並保存在本地。
二、區分樣本。對每張驗證碼圖片進行人工識別區分,重命名爲該圖片的驗證碼。
三、清洗切割樣本,提取樣本特徵。圖片識別需要儘可能細地區分出特徵點。我們觀察上圖的驗證碼圖片可以發現多個信息:
● 驗證碼的背景存在着許多幹擾線。
● 每個數字分明,所佔的位置幾乎是均等的。
● 驗證碼的數字顏色比較深,干擾因素顏色較淺。
我們可以嘗試通過顏色的深淺去除干擾因素。先通過灰度處理,將驗證碼中顏色較淺的點置換成白色,顏色較深的點置換成黑色。
通過改變灰度閾值grayValue不斷嘗試去除干擾點。最後得到乾淨的驗證碼。
接下來通過識別圖片中的黑色點,使用下面的trainData()方法。
沿着黑色點進行矩形切割,得到單個數字的特徵樣本。
得到的驗證碼特徵樣本訓練集合如下:
四、提取目標驗證碼的特徵,與訓練集合做對比,識別目標驗證碼圖片
通過上面的三步,我們已經得到了一組樣本特徵,接下來只需要把將目標驗證碼同樣執行上面的3步。把提取出來的目標驗證碼特徵與樣本特徵作對比。如果雙方絕大部分像素點的顏色相同,則可認爲目標驗證碼與樣本內容一致。取樣本的文件名,即可等到目標驗證的內容了。以下爲對比識別的代碼。
總結
通過上面的四部操作,我們已經能夠識別出一些網站的驗證碼了。上面使用的方法是通過顏色的深淺,去除干擾素,再提取樣本特徵進行對比。面對其他的一些驗證碼需要我們通過觀察掌握圖片的規律,靈活地使用其他的算法來識別去除干擾素,提取出樣本特徵。
同樣地,在生成驗證碼的過程中,我們需要避免生成易於去除的干擾素。各個驗證碼之間在不影響人工識別的情況下儘可能粘連起來,避免被切割分類。
文章來自公衆號:睿江雲計算