一、探討
識(shí)別圖形驗(yàn)證碼可以說(shuō)是做爬蟲的必修課,涉及到計(jì)算機(jī)圖形學(xué),機(jī)器學(xué)習(xí),機(jī)器視覺(jué),人工智能等等高深領(lǐng)域……
簡(jiǎn)單地說(shuō),計(jì)算機(jī)圖形學(xué)的主要研究?jī)?nèi)容就是研究如何在計(jì)算機(jī)中表示圖形、以及利用計(jì)算機(jī)進(jìn)行圖形的計(jì)算、處理和顯示的相關(guān)原理與算法。圖形通常由點(diǎn)、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。計(jì)算機(jī)涉及到的幾何圖形處理一般有 2維到n維圖形處理,邊界區(qū)分,面積計(jì)算,體積計(jì)算,扭曲變形校正。對(duì)于顏色則有色彩空間的計(jì)算與轉(zhuǎn)換,圖形上色,陰影,色差處理等等。
在破解驗(yàn)證碼中需要用到的知識(shí)一般是 像素,線,面等基本2維圖形元素的處理和色差分析。常見工具為:
支持向量機(jī)(SVM)
OpenCV
圖像處理軟件(Photoshop,Gimp…)
Python Image Library
二、PIL安裝
PIL: Python Imaging Library, 是Python平臺(tái)的圖像處理標(biāo)準(zhǔn)庫(kù),功能非常強(qiáng)大。
在Debian/Ubantu Linux下直接通過(guò)apt安裝:
$sudo apt-get install python-imaging
Max和其他版本的Linux可以直接使用easy_install或pip安裝,安裝前需要把編譯環(huán)境裝好:
$ sudo easy_install PIL
Windos平臺(tái)可以直接去PIL官網(wǎng)下載exe安裝包。http://pythonware.com/products/pil/
注:官網(wǎng)提供的安裝包是32位的,64位系統(tǒng)請(qǐng)前往這里http://www.lfd.uci.edu/~gohlke/pythonlibs/#pillow下載替代包pillow。
三、一般思路
驗(yàn)證碼識(shí)別的一般思路為:
1、圖片降噪
2、圖片切割
3、圖像文本輸出
3.1 圖片降噪
所謂降噪就是把不需要的信息通通去除,比如背景,干擾線,干擾像素等等,只剩下需要識(shí)別的文字,讓圖片變成2進(jìn)制點(diǎn)陣最好。
對(duì)于彩色背景的驗(yàn)證碼:每個(gè)像素都可以放在一個(gè)5維的空間里,這5個(gè)維度分別是,X,Y,R,G,B,也就是像素的坐標(biāo)和顏色,在計(jì)算機(jī)圖形學(xué)中,有很多種色彩空間,最常用的比如RGB,印刷用的CYMK,還有比較少見的HSL或者HSV,每種色彩空間的維度都不一樣,但是可以通過(guò)公式互相轉(zhuǎn)換。在RGB空間中不好區(qū)分顏色,可以把色彩空間轉(zhuǎn)換為HSV或HSL。色彩空間參見http://baike.baidu.com/view/3427413.htm
驗(yàn)證碼圖片7039.jpg:
1、導(dǎo)入Image包,打開圖片:
fromPIL importImage
im = Image.open('7039.jpg')
2、把彩色圖像轉(zhuǎn)化為灰度圖像。RBG轉(zhuǎn)化到HSI彩色空間,采用I分量:
imgry = im.convert('L')
imgry.show()
灰度看起來(lái)是這樣的:
3、二值化處理
二值化是圖像分割的一種常用方法。在二值化圖象的時(shí)候把大于某個(gè)臨界灰度值的像素灰度設(shè)為灰度極大值,把小于這個(gè)值的像素灰度設(shè)為灰度極小值,從而實(shí)現(xiàn)二值化(一般設(shè)置為0-1)。根據(jù)閾值選取的不同,二值化的算法分為固定閾值和自適應(yīng)閾值,這里選用比較簡(jiǎn)單的固定閾值。
把像素點(diǎn)大于閾值的設(shè)置,1,小于閾值的設(shè)置為0。生成一張查找表,再調(diào)用point()進(jìn)行映射。
threshold = 140
table = []
foriinrange(256):
ifi < threshold:
table.append(0)
else:
table.append(1)
out = imgry.point(table,'1')
out.show()
處理結(jié)果看起來(lái)是這樣的:
3.2 圖片切割
識(shí)別驗(yàn)證碼的重點(diǎn)和難點(diǎn)就在于能否成功分割字符,對(duì)于顏色相同又完全粘連的字符,比如google的驗(yàn)證碼,目前是沒(méi)法做到5%以上的識(shí)別率的。不過(guò)google的驗(yàn)證碼基本上人類也只有30%的識(shí)別率。本文使用的驗(yàn)證碼例子比較容易識(shí)別??梢圆挥们懈?,有關(guān)圖片切割的方法參見這篇博客:http://www.cnblogs.com/apexchu/p/4231041.html
四、利用pytesser模塊實(shí)現(xiàn)識(shí)別
pytesser是谷歌OCR開源項(xiàng)目的一個(gè)模塊,在python中導(dǎo)入這個(gè)模塊即可將圖片中的文字轉(zhuǎn)換成文本。
鏈接:https://code.google.com/p/pytesser/
pytesser 調(diào)用了 tesseract。在python中調(diào)用pytesser模塊,pytesser又用tesseract識(shí)別圖片中的文字。
4.1 pytesser安裝
如果沒(méi)有安裝PIL,請(qǐng)到這里下載安裝:http://www.pythonware.com/products/pil/
安裝pytesser,下載地址:http://code.google.com/p/pytesser/ ,下載后直接將其解壓到項(xiàng)目代碼下,或者解壓到python安裝目錄的Libsite-packages下,并將其添加到path環(huán)境變量中,不然在導(dǎo)入模塊時(shí)會(huì)出錯(cuò)。
下載Tesseract OCR engine:http://code.google.com/p/tesseract-ocr/ ,下載后解壓,找到tessdata文件夾,用其替換掉pytesser解壓后的tessdata文件夾即可。
另外如果現(xiàn)在都是從PIL庫(kù)中運(yùn)入Image,沒(méi)有使用Image模塊,所以需要把pytesser.py中的import Image改為from PIL import Image, 其次還需要在pytesser文件夾中新建一個(gè)__init__.py的空文件。
ps:如果覺(jué)得后面兩步比較麻煩,可以直接到云盤中下載 http://yun.baidu.com/s/1jHJvNiI,操作如步驟2。
4.2 調(diào)用pytesser識(shí)別
pytesser提供了兩種識(shí)別圖片方法,通過(guò)image對(duì)象和圖片地址,代碼判斷如下:
fromPIL importImage
frompytesser importpytesser
image = Image.open('7039.jpg')
printpytesser.image_file_to_string('7039.jpg')
printpytesser.image_to_string(image)
-
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627
原文標(biāo)題:20行 Python 代碼實(shí)現(xiàn)驗(yàn)證碼識(shí)別
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論