12 字符驗(yàn)證碼
一、驗(yàn)證碼簡(jiǎn)介
什么是驗(yàn)證碼?
驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫(xiě)隧膘。
是一種用來(lái)區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序。
驗(yàn)證碼的作用?
認(rèn)證碼是一種人機(jī)識(shí)別手段,最終目的是區(qū)分正常用戶和機(jī)器的操作辛润。
可以防止:惡意破解密碼、注冊(cè)见秤、刷票砂竖、論壇灌水真椿,防止黑客對(duì)用戶的密碼進(jìn)行暴力破解。
一般是提出一個(gè)問(wèn)題乎澄,這個(gè)問(wèn)題可以由計(jì)算機(jī)生成并評(píng)判突硝,但是必須只有人類才能解答。由于計(jì)算機(jī)無(wú)法解答這個(gè)的問(wèn)題置济,所以回答出問(wèn)題的用戶就可以被認(rèn)為是人類解恰。
驗(yàn)證碼類別
驗(yàn)證碼自面世以來(lái)就一直在更新,迭代浙于。
圖形驗(yàn)證碼:這類驗(yàn)證碼大多是計(jì)算機(jī)隨機(jī)產(chǎn)生一個(gè)字符串修噪,在把字符串增加噪點(diǎn)、干擾線路媚、變形、重疊樊销、不同顏色整慎、扭曲組成一張圖片來(lái)增加識(shí)別難度。
滑動(dòng)驗(yàn)證碼:也叫行為驗(yàn)證碼围苫,比較流行的一種驗(yàn)證碼裤园,通過(guò)用戶的操作行為來(lái)完成驗(yàn)證,其中最出名的就是極驗(yàn)剂府。
滑動(dòng)驗(yàn)證碼的原理就是使用機(jī)器學(xué)習(xí)中的深度學(xué)習(xí)技術(shù)拧揽,根據(jù)一些特征來(lái)區(qū)分是否為正常用戶。通過(guò)記錄用戶的滑動(dòng)速度腺占,還有每一小段時(shí)間的瞬時(shí)速度淤袜,用戶鼠標(biāo)點(diǎn)擊情況,以及滑動(dòng)后的匹配程度來(lái)識(shí)別衰伯。而且铡羡,不是說(shuō)滑動(dòng)到正確位置就是驗(yàn)證通過(guò),而是根據(jù)特征識(shí)別來(lái)區(qū)分是否為真用戶意鲸,滑到正確位置只是一個(gè)必要條件烦周。
點(diǎn)觸驗(yàn)證碼:點(diǎn)擊類驗(yàn)證碼都是給出一張包含文字的圖片,通過(guò)文字提醒用戶點(diǎn)擊圖中相同字的位置進(jìn)行驗(yàn)證怎顾。
二读慎、Pillow庫(kù)
PIL庫(kù)
PIL (Python Image Library) 已經(jīng)算是 Python 處理圖片的標(biāo)準(zhǔn)庫(kù)了,兼具強(qiáng)大的功能和簡(jiǎn)潔的 API.
但是PIL庫(kù)的更新非常緩慢槐雾, 并且它只支持到python2.7夭委,不支持python3
Pillow
由于PIL庫(kù)更新太慢了,于是于是一群志愿者在PIL庫(kù)的基礎(chǔ)上創(chuàng)建了一個(gè)新的分支版本蚜退,命名為Pillow.
Pillow目前最新支持到python3.6闰靴,它的維護(hù)和開(kāi)發(fā)十分活躍彪笼,兼容PIL庫(kù)的絕大多數(shù)語(yǔ)法,并且增加了許多新的特性蚂且,推薦直接使用Pillow
注意點(diǎn)
Pillow和PIL不能共存在一個(gè)環(huán)境中配猫,如果你之前安裝了PIL的話,需要?jiǎng)h除掉才能在安裝Pillow
由于是繼承自PIL的分支杏死, 所以Pillow庫(kù)的導(dǎo)入是這樣的
Import PIL
1泵肄、PIL基本概念
PIL中所涉及的基本概念有如下幾個(gè):通道(bands)、尺寸(size)淑翼、坐標(biāo)系統(tǒng)(coordinate system)腐巢。
通道:
每張圖片都是由一個(gè)或者多個(gè)數(shù)據(jù)通道構(gòu)成,如果這些通道具有相同的維數(shù)和深度玄括,PIL允許將這些通道進(jìn)行疊加
以RGB圖像為例冯丙,每張圖片都是由三個(gè)數(shù)據(jù)通道疊加構(gòu)成,分別為R 遭京、G 胃惜、B。
對(duì)于灰度圖像(沒(méi)有色彩的圖片哪雕, RGB色彩分量全部相等)船殉,只有一個(gè)通道。
灰度指的是黑白圖像中點(diǎn)的顏色深度斯嚎,范圍一般是0到255利虫, 白色為255,黑色為0
對(duì)于一張圖片的通道數(shù)量和名稱堡僻,可以通過(guò)方法getbands()來(lái)獲取糠惫。方法getbands()是PIL中Image子模塊的方法,它會(huì)返回一個(gè)字符串組成的元祖钉疫,元祖中包括了每一個(gè)通道的名稱寞钥。
尺寸:
圖片尺寸(size)指的是圖片的寬度和高度
通過(guò)size屬性可以獲取圖片的尺寸,它的返回值是一個(gè)元祖陌选,元祖里面有兩個(gè)值理郑,分別是水平和垂直方向上的像素個(gè)數(shù)
坐標(biāo)系統(tǒng) :
PIL使用笛卡爾像素坐標(biāo)系統(tǒng),圖像的左上角為左邊的原點(diǎn)(0咨油,0)您炉,這就意味著,x軸的數(shù)值是從左到右增長(zhǎng)的役电,y軸的數(shù)值是從上到下增長(zhǎng)的赚爵。
在我們處理圖像的時(shí)候,常常需要去表示一個(gè)矩形的圖像區(qū)域。Pillow中很多方法都需要傳入一個(gè)表示矩形區(qū)域的元祖
這個(gè)元祖包含四個(gè)值冀膝,分別表示矩形四條邊距離x軸或者y軸的距離唁奢。順序是(左,頂窝剖,右麻掸,底)
例如,一個(gè)800x600的像素圖像表示為(0赐纱, 0脊奋, 800, 600)
from PIL import Image
im = Image.open('yasuo.jpg')
# 獲取通道
print('通道:', im.getbands())
# 獲取尺寸size
print('尺寸:',im.size)
# 調(diào)用系統(tǒng)默認(rèn)圖片打開(kāi)應(yīng)用打開(kāi)
im.show()
2疙描、PIL操作圖像
Image是Pillow中最為重要的類诚隙,實(shí)現(xiàn)了Pillow中大部分的功能,創(chuàng)建這個(gè)類的實(shí)例主要有三個(gè)方式:
1.從文件中加載圖像
2.創(chuàng)建一個(gè)新的圖像
3.處理其他的圖像獲得
from PIL import Image
im1 = Image.open('yasuo.jpg')
im2 = Image.new('RGB', (200,200), 'red')
im3 = im1.crop((100, 100, 200, 200))
im2.show()
im3.show()
三起胰、簡(jiǎn)單驗(yàn)證碼處理
1久又、灰度化
像素點(diǎn)是最小的圖片單元,一張圖片由很多像素點(diǎn)構(gòu)成效五,一個(gè)像素點(diǎn)的顏色是由RGB三個(gè)值來(lái)表現(xiàn)的籽孙,所以一個(gè)像素點(diǎn)對(duì)應(yīng)三個(gè)顏色向量矩陣,我們對(duì)圖像的處理就是對(duì)這個(gè)像素點(diǎn)的操作火俄。
圖片的灰度化,就是讓像素點(diǎn)矩陣中的每一個(gè)像素點(diǎn)滿足 R=G=B讲冠,此時(shí)這個(gè)值叫做灰度值瓜客,白色為0,黑色為255
灰度轉(zhuǎn)化一般公式為:
R=G=B = 處理前的 RX0.3 + GX0.59 + B*0.11
from PIL import Image
im1 = Image.open('yasuo.jpg')
# 灰度化
im2 = im1.convert('L')
im2.show()
2竿开、二值化
圖像的二值化谱仪,就是將圖像的像素點(diǎn)矩陣中的每個(gè)像素點(diǎn)的灰度值設(shè)置為0(黑色)或255(白色),從而實(shí)現(xiàn)二值化否彩,將整個(gè)圖像呈現(xiàn)出明顯的只有黑和白的視覺(jué)效果疯攒。
二值化原理是利用設(shè)定的一個(gè)閾值來(lái)判斷圖像像素是0還是255, 一般小于閾值的像素點(diǎn)變?yōu)?列荔, 大于的變成255
這個(gè)臨界灰度值就被稱為閾值敬尺,閾值的設(shè)置很重要,閾值過(guò)大或過(guò)小都會(huì)對(duì)圖片造成損壞
選擇閾值的原則是:既要盡可能保存圖片信息贴浙,又要盡可能減少背景和噪聲的干擾
常用閾值選擇的方法是:
灰度平局值法: 取127 (0~255的中數(shù)砂吞, (0+255)/2 = 127)
平均值法:計(jì)算像素點(diǎn)矩陣中的所有像素點(diǎn)的灰度值的平均值avg
迭代法:選擇一個(gè)近似閾值作為估計(jì)值的初始值,然后進(jìn)行分割圖像崎溃,根據(jù)產(chǎn)生的子圖像的特征來(lái)選取新的閾值蜻直,在利用新的閾值分割圖像,經(jīng)過(guò)多次循環(huán),使得錯(cuò)誤分割的圖像像素點(diǎn)降到最小概而。
from PIL import Image
im1 = Image.open('yasuo.jpg')
w,h = im1.size
# 獲取像素點(diǎn)集合
pixdata = im1.load()
im1.show()
for x in range(w):
for y in range(h):
p = list(pixdata[x, y])
if p[0] <127:
p[0] = 0
p[1] = 0
p[2] = 0
else:
p[0] = 255
p[1] = 255
p[2] = 255
pixdata[x, y] = tuple(p)
im1.show()
3呼巷、降噪
經(jīng)過(guò)了二值化處理,整個(gè)圖片像素就被分為了兩個(gè)值0和255赎瑰, 如果一個(gè)像素點(diǎn)是圖片或者干擾因素的一部分王悍,那么她的灰度值一定是0(黑色),如果一個(gè)點(diǎn)是背景乡范,其灰度值應(yīng)該是255配名,白色
所以對(duì)于孤立的噪點(diǎn),他的周圍應(yīng)該都是白色晋辆,或者大多數(shù)點(diǎn)都是白色的渠脉,所以在判斷的時(shí)候條件應(yīng)該放寬,一個(gè)點(diǎn)是黑色并且相鄰的點(diǎn)為白色的點(diǎn)的個(gè)數(shù)大于一個(gè)固定的值瓶佳,那么這個(gè)點(diǎn)就是噪點(diǎn)芋膘。
我們根據(jù)一個(gè)點(diǎn)A的RGB值,與周圍的8個(gè)點(diǎn)的RBG值比較霸饲,設(shè)定一個(gè)值N(0 <N <8)为朋,當(dāng)A的RGB值與周圍8個(gè)點(diǎn)的RGB相等或者小于N時(shí),此點(diǎn)為噪點(diǎn)
四厚脉、OCR識(shí)別
OCR (Optical Character Recognition)光學(xué)字符識(shí)別习寸, 指的是對(duì)文本資料的圖像文件進(jìn)行分析識(shí)別處理,獲取文集及版面信息的過(guò)程
Tesseract-OCR是一個(gè)開(kāi)源的字符識(shí)別引擎傻工,我們可以用他來(lái)識(shí)別一些簡(jiǎn)單的驗(yàn)證碼霞溪。
Windows安裝:
安裝文件在
Linux安裝:
sudo apt-get install tesseract-ocr
sudo apt-get install libtesseract-dev
Mac安裝:
brew install tesseract
Pytesser3是一個(gè)在Python內(nèi)使用Tesseract-Ocr的庫(kù),安裝非常簡(jiǎn)單:
pip install Pytesser3
然后需要進(jìn)行配置中捆, 將pytesser3包下面init文件內(nèi)tesseract_exe_name的值設(shè)置為為你的tesseract.exe的路徑