20行 Python 代碼實現(xiàn)簡單驗證碼識別

分享一篇文章泣特,原文來自:j_hao104的個人頁面浩姥。

一、探討

識別圖形驗證碼可以說是做爬蟲的必修課状您,涉及到計算機圖形學勒叠,機器學習,機器視覺膏孟,人工智能等等高深領域……

簡單地說眯分,計算機圖形學的主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算柒桑、處理和顯示的相關原理與算法弊决。圖形通常由點、線、面飘诗、體等幾何元素和灰度与倡、色彩、線型昆稿、線寬等非幾何屬性組成纺座。計算機涉及到的幾何圖形處理一般有 2維到n維圖形處理,邊界區(qū)分溉潭,面積計算净响,體積計算,扭曲變形校正喳瓣。對于顏色則有色彩空間的計算與轉換馋贤,圖形上色,陰影畏陕,色差處理等等配乓。

在破解驗證碼中需要用到的知識一般是 像素,線蹭秋,面等基本2維圖形元素的處理和色差分析扰付。常見工具為:

  • 支持向量機(SVM)
  • OpenCV
  • 圖像處理軟件(Photoshop,Gimp…)
  • Python Image Library

二、PIL安裝

PIL: Python Imaging Library, 是Python平臺的圖像處理標準庫仁讨,功能非常強大。

在Debian/Ubantu Linux下直接通過apt安裝:

$sudo apt-get install python-imaging

Max和其他版本的Linux可以直接使用easy_install或pip安裝实昨,安裝前需要把編譯環(huán)境裝好:

$ sudo easy_install PIL

Windos平臺可以直接去PIL官網下載exe安裝包洞豁。http://pythonware.com/products/pil/

注:官網提供的安裝包是32位的,64位系統(tǒng)請前往這里 http://www.lfd.uci.edu/~gohlke/pythonlibs/#pillow 下載替代包pillow荒给。

三丈挟、一般思路

驗證碼識別的一般思路為:

1、圖片降噪

2志电、圖片切割

3曙咽、圖像文本輸出

3.1 圖片降噪

所謂降噪就是把不需要的信息通通去除,比如背景挑辆,干擾線例朱,干擾像素等等,只剩下需要識別的文字鱼蝉,讓圖片變成2進制點陣最好洒嗤。

對于彩色背景的驗證碼:每個像素都可以放在一個5維的空間里,這5個維度分別是魁亦,X,Y,R,G,B渔隶,也就是像素的坐標和顏色,在計算機圖形學中洁奈,有很多種色彩空間间唉,最常用的比如RGB绞灼,印刷用的CYMK,還有比較少見的HSL或者HSV呈野,每種色彩空間的維度都不一樣低矮,但是可以通過公式互相轉換。在RGB空間中不好區(qū)分顏色际跪,可以把色彩空間轉換為HSV或HSL商佛。色彩空間參見 http://baike.baidu.com/view/3427413.htm

驗證碼圖片7039.jpg:

image

1、導入Image包姆打,打開圖片:

from PIL import Image
im = Image.open('7039.jpg')

2良姆、把彩色圖像轉化為灰度圖像。RBG轉化到HSI彩色空間幔戏,采用I分量:

imgry = im.convert('L')
imgry.show()

灰度看起來是這樣的:

image

3玛追、二值化處理

二值化是圖像分割的一種常用方法。在二值化圖象的時候把大于某個臨界灰度值的像素灰度設為灰度極大值闲延,把小于這個值的像素灰度設為灰度極小值痊剖,從而實現(xiàn)二值化(一般設置為0-1)。根據(jù)閾值選取的不同垒玲,二值化的算法分為固定閾值和自適應閾值陆馁,這里選用比較簡單的固定閾值。

把像素點大于閾值的設置,1合愈,小于閾值的設置為0叮贩。生成一張查找表,再調用point()進行映射佛析。

threshold = 140
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
out = imgry.point(table, '1')
out.show()

處理結果看起來是這樣的:

image

3.2 圖片切割

識別驗證碼的重點和難點就在于能否成功分割字符益老,對于顏色相同又完全粘連的字符,比如google的驗證碼寸莫,目前是沒法做到5%以上的識別率的捺萌。不過google的驗證碼基本上人類也只有30%的識別率。本文使用的驗證碼例子比較容易識別膘茎√掖浚可以不用切割,有關圖片切割的方法參見這篇博客:http://www.cnblogs.com/apexchu/p/4231041.html

四辽狈、利用pytesser模塊實現(xiàn)識別

pytesser是谷歌OCR開源項目的一個模塊慈参,在python中導入這個模塊即可將圖片中的文字轉換成文本。

鏈接:https://code.google.com/p/pytesser/

pytesser 調用了 tesseract刮萌。在python中調用pytesser模塊驮配,pytesser又用tesseract識別圖片中的文字。

4.1 pytesser安裝

  • 如果沒有安裝PIL,請到這里下載安裝:http://www.pythonware.com/products/pil/
  • 安裝pytesser壮锻,下載地址:http://code.google.com/p/pytesser/ 琐旁,下載后直接將其解壓到項目代碼下,或者解壓到python安裝目錄的Libsite-packages下猜绣,并將其添加到path環(huán)境變量中灰殴,不然在導入模塊時會出錯。
  • 下載Tesseract OCR engine:http://code.google.com/p/tesseract-ocr/ 掰邢,下載后解壓牺陶,找到tessdata文件夾,用其替換掉pytesser解壓后的tessdata文件夾即可辣之。
  • 另外如果現(xiàn)在都是從PIL庫中運入Image掰伸,沒有使用Image模塊,所以需要把pytesser.py中的import Image改為from PIL import Image, 其次還需要在pytesser文件夾中新建一個init.py的空文件怀估。

ps:如果覺得后面兩步比較麻煩狮鸭,可以直接到云盤中下載 http://yun.baidu.com/s/1jHJvNiI ,操作如步驟2多搀。

4.2 調用pytesser識別

pytesser提供了兩種識別圖片方法歧蕉,通過image對象和圖片地址,代碼判斷如下:

from PIL import Image
from pytesser import pytesser
image = Image.open('7039.jpg')
print pytesser.image_file_to_string('7039.jpg')
print pytesser.image_to_string(image)

同時pytesser還支持其他語言的識別康铭,比如中文惯退。具體參見:http://blog.csdn.net/hk_jh/article/details/8961449

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市从藤,隨后出現(xiàn)的幾起案子蒸痹,更是在濱河造成了極大的恐慌,老刑警劉巖呛哟,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匿沛,居然都是意外死亡扫责,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門逃呼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳖孤,“玉大人,你說我怎么就攤上這事抡笼∷沾В” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵推姻,是天一觀的道長平匈。 經常有香客問我,道長,這世上最難降的妖魔是什么增炭? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任忍燥,我火速辦了婚禮,結果婚禮上隙姿,老公的妹妹穿的比我還像新娘梅垄。我一直安慰自己,他們只是感情好输玷,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布队丝。 她就那樣靜靜地躺著,像睡著了一般欲鹏。 火紅的嫁衣襯著肌膚如雪机久。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天貌虾,我揣著相機與錄音吞加,去河邊找鬼。 笑死尽狠,一個胖子當著我的面吹牛衔憨,可吹牛的內容都是我干的。 我是一名探鬼主播袄膏,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼践图,長吁一口氣:“原來是場噩夢啊……” “哼霞揉!你這毒婦竟也來了姑曙?” 一聲冷哼從身側響起布疼,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓦胎,失蹤者是張志新(化名)和其女友劉穎瞳别,沒想到半個月后吃度,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體项阴,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡喊式,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年锌奴,在試婚紗的時候發(fā)現(xiàn)自己被綠了兽狭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹿蜀,死狀恐怖箕慧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情茴恰,我是刑警寧澤颠焦,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站往枣,受9級特大地震影響伐庭,放射性物質發(fā)生泄漏粉渠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一似忧、第九天 我趴在偏房一處隱蔽的房頂上張望渣叛。 院中可真熱鬧,春花似錦盯捌、人聲如沸淳衙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箫攀。三九已至,卻和暖如春幼衰,著一層夾襖步出監(jiān)牢的瞬間靴跛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工渡嚣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梢睛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓识椰,卻偏偏與公主長得像绝葡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腹鹉,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容