成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

使用Python進(jìn)行驗(yàn)證碼識(shí)別

2013-04-15 09:38:43來源:Linux Today作者:天明

以前寫過一個(gè)刷校內(nèi)網(wǎng)的人氣的工具,JAVA的(以后再也不行Java程序了),里面用到了驗(yàn)證碼識(shí)別,那段代碼不是我自己寫的:-) 校內(nèi)的驗(yàn)證是完全單色沒有任何干撓的驗(yàn)證碼,識(shí)別起來比較容易,不過從那段代碼中可以看到基

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

以前沒用Python處理過圖像,不太了解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濾鏡中的去噪效果還行,但是沒有在PIL找到去噪的函數(shù),后來發(fā)現(xiàn)中值過濾后可以去掉大部分的噪點(diǎn),而且PIL里有現(xiàn)成的函數(shù),接下來我試著直接把圖像轉(zhuǎn)換為單色,結(jié)果發(fā)現(xiàn)還是 會(huì)有不過的噪點(diǎn)留了下來,因?yàn)橹兄颠^濾時(shí)把不少噪點(diǎn)淡化了,但轉(zhuǎn)換為音色時(shí)這些噪點(diǎn)又被強(qiáng)化顯示了,于是在中值過濾后對(duì)圖像亮度進(jìn)行加強(qiáng)處理,然后再轉(zhuǎn)換 為單色,這樣驗(yàn)證碼圖片就變得比較容易識(shí)別了:

pic
pic1

上面這些處理使用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()

接下來就是提取這些數(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,用于接下來的匹配;

提取完字模后剩下來的就是對(duì)需要處理的圖片進(jìn)行與數(shù)據(jù)庫中的字模進(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)一)、字庫特征匹配識(shí)別。

關(guān)鍵詞:Python

贊助商鏈接:

主站蜘蛛池模板: 油尖旺区| 威海市| 平武县| 苍梧县| 河西区| 镇远县| 石河子市| 金昌市| 筠连县| 商都县| 鄂尔多斯市| 宁安市| 徐汇区| 荥阳市| 临清市| 霍邱县| 万盛区| 兖州市| 山阳县| 共和县| 阜宁县| 芜湖市| 西藏| 河源市| 阜平县| 江川县| 邵阳市| 乌兰察布市| 黔东| 崇左市| 荃湾区| 汝南县| 稷山县| 江城| 武胜县| 安乡县| 乌什县| 南华县| 赣州市| 卫辉市| 长寿区|