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

 


        用python加「驗證碼」爲關鍵詞在baidu裏搜一下,能夠找到不少關於驗證碼識別的文章。我大致看了一下,主要方法有幾類:一類是經過對圖片進行處理,而後利用字庫特徵匹配的方法,一類是圖片處理後創建字符對應字典,還有一類是直接利用ocr模塊進行識別。無論是用什麼方法,都須要首先對圖片進行處理,因而試着對下面的驗證碼進行分析。
        1、圖片處理python

 


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



        2、字符驗證
        這裏我使用的方法是利用pytesser進行ocr識別,但因爲這類驗證碼字符的不規則性,使得驗證結果的準確性並非很高。具體哪位大牛,有什麼好的辦法,但願能給指點一下。
        3、準備工做與代碼實例
        一、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文件夾便可。
        二、具體代碼ide

複製代碼
#encoding=utf-8
###利用點的密度計算
import Image,ImageEnhance,ImageFilter,ImageDraw
import sys
from 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()
複製代碼

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

相關文章
相關標籤/搜索