欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python驗(yàn)證碼識(shí)別

 更新時(shí)間:2016年01月25日 10:32:22   作者:不得閑  
這幾天在寫一個(gè)程序的時(shí)候需要識(shí)別驗(yàn)證碼,因?yàn)槌绦蚴荘ython寫的自然打算用Python進(jìn)行驗(yàn)證碼的識(shí)別。下面把實(shí)現(xiàn)思路分享在腳本之家平臺(tái),感興趣的朋友可以參考下

以前寫過(guò)一個(gè)刷校內(nèi)網(wǎng)的人氣的工具,Java的(以后再也不行Java程序了),里面用到了驗(yàn)證碼識(shí)別,那段代碼不是我自己寫的:-) 校內(nèi)的驗(yàn)證是完全單色沒(méi)有任何干撓的驗(yàn)證碼,識(shí)別起來(lái)比較容易,不過(guò)從那段代碼中可以看到基本的驗(yàn)證碼識(shí)別方式。這幾天在寫一個(gè)程序的時(shí)候需要識(shí)別驗(yàn)證碼,因?yàn)槌绦蚴荘ython寫的自然打算用Python進(jìn)行驗(yàn)證碼的識(shí)別。

以前沒(méi)用Python處理過(guò)圖像,不太了解PIL(Python Image Library)的用法,這幾天看了看PIL,發(fā)現(xiàn)它太強(qiáng)大了,簡(jiǎn)直和ImageMagic,PS可以相比了。(這里有PIL不錯(cuò)的文檔)

由于上面的驗(yàn)證碼是24位的jpeg圖像,并且包含了噪點(diǎn),所以我們要做的就是去噪和去色,我拿PS找了張驗(yàn)證碼試了試,使用PS濾鏡中的去噪效果還行, 但是沒(méi)有在PIL找到去噪的函數(shù),后來(lái)發(fā)現(xiàn)中值過(guò)濾后可以去掉大部分的噪點(diǎn),而且PIL里有現(xiàn)成的函數(shù),接下來(lái)我試著直接把圖像轉(zhuǎn)換為單色,結(jié)果發(fā)現(xiàn)還是 會(huì)有不過(guò)的噪點(diǎn)留了下來(lái),因?yàn)橹兄颠^(guò)濾時(shí)把不少噪點(diǎn)淡化了,但轉(zhuǎn)換為音色時(shí)這些噪點(diǎn)又被強(qiáng)化顯示了,于是在中值過(guò)濾后對(duì)圖像亮度進(jìn)行加強(qiáng)處理,然后再轉(zhuǎn)換 為單色,這樣驗(yàn)證碼圖片就變得比較容易識(shí)別了:

上面這些處理使用Python才幾行:

im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.show()

接下來(lái)就是提取這些數(shù)字的字模,使用shell腳本下載100幅圖片,抽出三張圖片獲取字模:

#!/usr/bin/env python
#encoding=utf-8
import Image,ImageEnhance,ImageFilter
import sys
image_name = "./images/81.jpeg"
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
#im.show()
#all by pixel
s = 12 #start postion of first number
w = 10 #width of each number
h = 15 #end postion from top
t = 2 #start postion of top
im_new = []
#split four numbers in the picture
for i in range(4):
im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
im_new.append(im1)
f = file("data.txt","a")
for k in range(4):
l = []
#im_new[k].show()
for i in range(13):
for j in range(10):
if (im_new[k].getpixel((j,i)) == 255):
l.append(0)
else:
l.append(1)
f.write("l=[")
n = 0
for i in l:
if (n%10==0):
f.write("/n")
f.write(str(i)+",")
n+=1
f.write("]/n")

把字模保存為list,用于接下來(lái)的匹配;

提取完字模后剩下來(lái)的就是對(duì)需要處理的圖片進(jìn)行與數(shù)據(jù)庫(kù)中的字模進(jìn)行匹配了,基本的思路就是看相應(yīng)點(diǎn)的重合率,但是由于噪點(diǎn)的影響在對(duì)(6,8) (8,3)(5,9)的匹配時(shí)容易出錯(cuò),俺自己針對(duì)已有的100幅圖片數(shù)據(jù)采集進(jìn)行分析,采用了雙向匹配(圖片與字模分別作為基點(diǎn)),做了半天的測(cè)試終于 可以實(shí)現(xiàn)100%的識(shí)別率。

#!/usr/bin/env python
#encoding=utf-8
import Image,ImageEnhance,ImageFilter
import Data
DEBUG = False
def d_print(*msg):
global DEBUG
if DEBUG:
for i in msg:
print i,
print
else:
pass
def Get_Num(l=[]):
min1 = []
min2 = []
for n in Data.N:
count1=count2=count3=count4=0
if (len(l) != len(n)):
print "Wrong pic"
exit()
for i in range(len(l)):
if (l[i] == 1):
count1+=1
if (n[i] == 1):
count2+=1
for i in range(len(l)):
if (n[i] == 1):
count3+=1
if (l[i] == 1):
count4+=1
d_print(count1,count2,count3,count4)
min1.append(count1-count2)
min2.append(count3-count4)
d_print(min1,"/n",min2)
for i in range(10):
if (min1[i] <= 2 or min2[i] <= 2):
if ((abs(min1[i] - min2[i])) <10):
return i
for i in range(10): 
if (min1[i] <= 4 or min2[i] <= 4):
if (abs(min1[i] - min2[i]) <= 2):
return i
for i in range(10):
flag = False
if (min1[i] <= 3 or min2[i] <= 3):
for j in range(10):
if (j != i and (min1[j] <5 or min2[j] <5)):
flag = True
else:
pass
if (not flag):
return i
for i in range(10): 
if (min1[i] <= 5 or min2[i] <= 5):
if (abs(min1[i] - min2[i]) <= 10):
return i
for i in range(10):
if (min1[i] <= 10 or min2[i] <= 10):
if (abs(min1[i] - min2[i]) <= 3):
return i
#end of function Get_Num
def Pic_Reg(image_name=None):
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.show()
#all by pixel
s = 12 #start postion of first number
w = 10 #width of each number
h = 15 #end postion from top
t = 2 #start postion of top
im_new = []
#split four numbers in the picture
for i in range(4):
im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
im_new.append(im1)
s = ""
for k in range(4):
l = []
#im_new[k].show()
for i in range(13):
for j in range(10):
if (im_new[k].getpixel((j,i)) == 255):
l.append(0)
else:
l.append(1)
s+=str(Get_Num(l))
return s
print Pic_Reg("./images/22.jpeg")

這里再提一下驗(yàn)證碼識(shí)別的基本方法:截圖,二值化、中值濾波去噪、分割、緊縮重排(讓高矮統(tǒng)一)、字庫(kù)特征匹配識(shí)別。
這里只是針對(duì)一般的驗(yàn)證碼,高級(jí)驗(yàn)證碼的識(shí)別這里有篇不錯(cuò)的文章,太復(fù)雜的話涉及的東西就多了,那俺就沒(méi)興趣了,人工智能(好恐怖),俺只喜歡簡(jiǎn)單的東西。

相關(guān)文章

  • 推薦Python小白理想的IDE編輯器thonny

    推薦Python小白理想的IDE編輯器thonny

    這篇文章主要為大家介紹了推薦一款Python編輯器thonny,非常適合Python使用,具體原因文中給出詳細(xì)說(shuō)明,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Pandas —— resample()重采樣和asfreq()頻度轉(zhuǎn)換方式

    Pandas —— resample()重采樣和asfreq()頻度轉(zhuǎn)換方式

    今天小編就為大家分享一篇Pandas —— resample()重采樣和asfreq()頻度轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python 流程控制實(shí)例代碼

    Python 流程控制實(shí)例代碼

    Python是一門簡(jiǎn)單的語(yǔ)言。對(duì)于一個(gè)問(wèn)題,應(yīng)該只有一個(gè)解決方法。在Python中,有三種流程控制方法:if-else、while和for。
    2009-09-09
  • 利用Python?實(shí)現(xiàn)圖片轉(zhuǎn)字符畫

    利用Python?實(shí)現(xiàn)圖片轉(zhuǎn)字符畫

    這篇文章主要介紹了利用Python?實(shí)現(xiàn)圖片轉(zhuǎn)字符畫,要將圖片轉(zhuǎn)字符畫,需要先定義一個(gè)字符集,用來(lái)和灰度值做映射,將圖片每個(gè)像素的?RGB?值轉(zhuǎn)換為一個(gè)灰度值,將其對(duì)應(yīng)的字符輸出就得到字符畫
    2022-06-06
  • Python中dilb和face_recognition第三方包安裝失敗的解決

    Python中dilb和face_recognition第三方包安裝失敗的解決

    本文主要介紹了Python中dilb和face_recognition第三方包安裝失敗的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • macbook如何徹底刪除python的實(shí)現(xiàn)方法

    macbook如何徹底刪除python的實(shí)現(xiàn)方法

    本文主要介紹了macbook如何徹底刪除python的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • python之驗(yàn)證碼生成(gvcode與captcha)

    python之驗(yàn)證碼生成(gvcode與captcha)

    這篇文章主要介紹了python之驗(yàn)證碼生成(gvcode與captcha),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python字典dict常用方法函數(shù)實(shí)例

    Python字典dict常用方法函數(shù)實(shí)例

    這篇文章主要介紹了Python字典dict常用方法函數(shù)實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python的PIL庫(kù)中g(shù)etpixel方法的使用

    Python的PIL庫(kù)中g(shù)etpixel方法的使用

    這篇文章主要介紹了Python的PIL庫(kù)中g(shù)etpixel方法的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評(píng)論