關於利用python進行驗證碼識別的一些想法

來源:互聯網
上載者:User

轉載請註明:@小五義http://www.cnblogs.com/xiaowuyi

        用python加“驗證碼”為關鍵詞在baidu裡搜一下,可以找到很多關於驗證碼識別的文章。我大體看了一下,主要方法有幾類:一類是通過對圖片進行處理,然後利用字型檔特徵匹配的方法,一類是圖片處理後建立字元對應字典,還有一類是直接利用ocr模組進行識別。不管是用什麼方法,都需要首先對圖片進行處理,於是試著對下面的驗證碼進行分析。
        一、圖片處理

 

        這個驗證碼中主要的影響因素是中間的曲線,首先考慮去掉圖片中的曲線。考慮了兩種演算法:
        第一種是首先取到曲線頭的位置,即x=0時,黑點的位置。然後向後移動x的取值,觀察每個x下黑點的位置,判斷前後兩個相鄰黑點之間的距離,如果距離在一定範圍內,可以基本判斷該點是曲線上的點,最後將曲線上的點全部繪成白色。試了一下這種方法,結果得到的圖片效果很一般,曲線不能完全去除,而且容量將字元的線條去除。
        第二種考慮用單位面積內點的密度來進行計算。於是首先計算單位面積內點的個數,將單位面積內點個數少於某一指定數的面積去除,剩餘的部分基本上就是驗證碼字元的部分。本例中,為了便於操作,取了5*5做為單位範圍,並調整單位面積內點的標準密度為11。處理後的效果:

        二、字元驗證
        這裡我使用的方法是利用pytesser進行ocr識別,但由於這類驗證碼字元的不規則性,使得驗證結果的準確性並不是很高。具體哪位大牛,有什麼好的辦法,希望能給指點一下。
        三、準備工作與代碼執行個體
        1、PIL、pytesser、tesseract
        (1)安裝PIL::http://www.pythonware.com/products/pil/
        (2)pytesser::http://code.google.com/p/pytesser/,下載解壓後直接放在代碼相同的檔案夾下,即可使用。
        (3)Tesseract OCR engine下載:http://code.google.com/p/tesseract-ocr/,下載後解壓,找到tessdata檔案夾,用其替換掉pytesser解壓後的tessdata檔案夾即可。
        2、具體代碼

#encoding=utf-8###利用點的密度計算import Image,ImageEnhance,ImageFilter,ImageDrawimport sysfrom pytesser import *#計算範圍內點的個數def numpoint(im):    w,h = im.size    data = list( im.getdata() )    mumpoint=0    for x in range(w):        for y in range(h):            if data[ y*w + x ] !=255:#255是白色                mumpoint+=1    return mumpoint                #計算5*5範圍內點的密度def pointmidu(im):    w,h = im.size    p=[]    for y in range(0,h,5):        for x in range(0,w,5):            box = (x,y, x+5,y+5)            im1=im.crop(box)            a=numpoint(im1)            if a<11:##如果5*5範圍內小於11個點,那麼將該部分全部換為白色。                for i in range(x,x+5):                    for j in range(y,y+5):                        im.putpixel((i,j), 255)    im.save(r'img.jpg')        def ocrend():##識別    image_name = "img.jpg"    im = Image.open(image_name)    im = im.filter(ImageFilter.MedianFilter())    enhancer = ImageEnhance.Contrast(im)    im = enhancer.enhance(2)    im = im.convert('1')    im.save("1.tif")    print image_file_to_string('1.tif')        if __name__=='__main__':    image_name = "1.png"    im = Image.open(image_name)    im = im.filter(ImageFilter.DETAIL)    im = im.filter(ImageFilter.MedianFilter())        enhancer = ImageEnhance.Contrast(im)    im = enhancer.enhance(2)    im = im.convert('1')    ##a=remove_point(im)    pointmidu(im)    ocrend()

本人的這個方法,最終識別率確實不高,寫出來,哪位高手有好的思路或者做法,望不惜賜教!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.