【人工智能】圖像識別之小白天書——驗證碼篇(1)

本文介紹了圖像識別領域應用到驗證碼破解中的第一課,以一種極簡的,學習成本極低的方式,帶你初識AI,初識圖像識別。


如果您對圖像識別類的內容或者課程感興趣,敬請關注我們的訂閱號


介紹


圖像識別,顧名思義就是指利用計算機對圖像進行理解和分析的技術。圖像識別技術又是當下最熱的人工智能科學(AI)的眼睛,其重要性自然不言而喻!本系列文章定義爲是一套由淺入深的文章,驗證碼識別只是一個引子,後面會繼續介紹到身份證、銀行卡、各種證件、憑證、票據的識別,不排除更高級的可以用於自動駕駛等領域的技術。獨樂樂不如衆樂樂,很高興能作爲一個知識的搬運工,把團隊的一些小成果,用淺顯易懂的話講出來,和大家一起分享,一起成長!本文獻給那些在象牙塔外望而卻步的 “小白”們,希望通過本文的學習可以輕鬆的跨過圖像識別的門檻。


語言&環境


開發語言會選用當前不失流行又很簡單易學的Python語言。環境這一塊兒我會盡量在入門階段繞過那些重量級並且安裝極其繁瑣的框架,用輕量的最簡單有效的框架來解決問題。主要就是避免那種環境死活都裝不上(Caffe,TensorFlow),然後想要學習圖像識別的計劃夭折的情況……

 

PILPython Imaging Library,很好理解,是python用於處理圖像的類庫,功能齊全,安裝簡便,只需要用你的pip install一下,就裝上啦!沒有pip或者不會用的同學直接去下載:http://www.pythonware.com/products/pil/。


Numpy一個用python實現的科學計算包,我們主要用到它提供的一個強大的N維數組(Array)和一些矩陣運算功能。https://github.com/numpy/numpy這是git地址,下載一個zip包直接解壓縮然後setup就可以了,也很是簡單! 


驗證的方法,進入python直接import一下,如果沒有異常,那就說明安裝成功了!如圖1:                                                 


圖1

好,有這兩個就足夠了!我們馬上起飛!


圖像處理


下面我們就正式的對圖片進行識別!市面上絕大部分正常的驗證碼的識別都分爲三部曲:去噪、分割、識別。走起第一步,去噪~


第一步:去噪

去噪就是把驗證碼中的無用的干擾項去掉的一個過程,先看看這些調皮的小驗證碼,我們爲什麼要對驗證碼進行去噪。


圖2

看看這一張一張的小驗證碼時而如揉搓過的紙屑時而像爛土豆一樣,還有的上面有各種神祕的曲線……真是讓人感嘆設計者的用心良苦!不過上面這些都是比較溫柔的了,看看這個大神碼:                                             


圖3

像是幾個藏在柴火垛裏面的牛犢子QAQ……先讓我冷靜一下。

衆所周知,圖片都是由三原色組成的,也就是R(red),G(green),B(blue)(下圖左),每一個像素點都會有3個值,爲這個像素點的RGB值,通過這三個數值從0到255的變化,來組成世間所有的顏色!


大部分的驗證碼爲了人眼識別起來更加清晰,背景顏色及噪聲會略淺於驗證碼的主體顏色,(見圖2)這些文字還是很清晰的,因爲噪聲不會像圖3一樣確實的干擾到主體。所以我們可以採用一個臨界值,來區分某一個像素是驗證碼的主體還是噪聲。這時候,我們需要用到灰度圖。


圖4

灰度圖就是會把某個像素點的RGB三色轉換成一個值,也就是圖4右邊這個灰階中的某個點,網上這種轉換公式有很多,我們這裏直接採用PIL提供的方法,直接讀取圖片的灰度數據:

from PIL import Image
from numpy import * 

img = array(Image.open('E:\\test.jpg').convert('L'))


代碼非常好理解,使用PIL打開一個圖片,轉換成L模式,即灰度模式 (PIL支持1,L,P,RGB,RGBA,CMYK,YCbCr,I,F共9種模式),並且轉換成array對象。這個時候圖片就會由左邊變成右邊的樣子:                                     


圖5

這時圖片中每個像素點的信息就從之前的RGB三個信息變成了一個信息,即0~255(0是黑色,255是白色)的灰度值。我們可以較好的分別出,哪部分是噪聲,哪部分是有效信息。對比圖4的灰度圖,我們從左2/5的地方作爲臨界點,也就是認爲灰度值小於100是有效信息 (只針對本驗證碼,不同的驗證嗎有不同的去噪閥值),大於100都是噪聲,全部置爲白色:

from PIL import Image
from numpy import * 

img = array(Image.open('E:\\test.jpg').convert('L').point(lambda x:255 if x >100 else 0))



把之前的代碼略微修改一下,後面加一個point方法即爲對每個像素點的操作,參數傳入lambda表達式,把大於100的都置爲255,小於100的都置爲0,這個方法就是俗稱的二值化方法,使圖片黑白分明,就會得到下面這個圖片:


 圖6

看,所有噪聲都去的乾乾淨淨啦!圖片上只留下了我們需要的信息!至此,去噪工作也算是完成了!把這張圖片保存在一個目錄中,作爲我們下一步處理的圖片就好了。代碼如下:

Image.fromarray(img).save('E:\\test_clean.jpg')


至此,我們的驗證碼處理進程也過半了,先下課休息一下!敬請關注後續發佈的文章!

(未完待續…) 

微信掃一掃
關注該公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章