使用python以及工具包進行簡單的驗證碼識別


識別數字驗證碼

首先我們准備素材,4張驗證碼圖片如下:

   

 

第一步:

  打開圖像。

im = Image.open('temp1.jpg')
 

第二步:

  把彩色圖像轉化為灰度圖像。彩色圖像轉化為灰度圖像的方法很多,這里采用RBG轉化到HSI彩色空間,采用I分量。

imgry = im.convert('L')
 

灰度看起來是這樣的       

 

第三步:

  需要把圖像中的噪聲去除掉。這里的圖像比較簡單,直接閾值化就行了。我們把大於閾值threshold的像素置為1,其他的置為0。對此,先生成一張查找表,映射過程讓庫函數幫我們做。

threshold = 140
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:

 

閾值為什么是140呢?試出來的,或者參考直方圖。

 

映射過程為

 out = imgry.point(table,'1')

此時圖像看起來是這樣的

 

第四步:

  將圖片中的字符轉化為文本。采用pytesser 中的image_to_string函數

text = image_to_string(out)

第五步:
  優化。根據觀察,驗證碼中只有數字,並且上面的文字識別程序經常把8識別為S。因此,對於識別結果,在進行一些替換操作。
#由於都是數字
#對於識別成字母的 采用該表進行修正
rep={'O':'0',
    'I':'1','L':'1',
    'Z':'2',
    'S':'8'
   for r in rep:
        text = text.replace(r,rep[r])

 

好了,text中為最終結果。
7025
0195
7039
6716

注:程序需要 PIL庫pytesser庫支持。
 
完整代碼:
import Image
import ImageEnhance
import ImageFilter
import sys
from pytesser import *
 
# 二值化
threshold = 140
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
 
#由於都是數字
#對於識別成字母的 采用該表進行修正
rep={'O':'0',
    'I':'1','L':'1',
    'Z':'2',
    'S':'8'
    };
 
def  getverify1(name):
    
    #打開圖片
    im = Image.open(name)
    #轉化到亮度
    imgry = im.convert('L')
    imgry.save('g'+name)
    #二值化
    out = imgry.point(table,'1')
    out.save('b'+name)
    #識別
    text = image_to_string(out)
    #識別對嗎
    text = text.strip()
    text = text.upper();
 
    for r in rep:
        text = text.replace(r,rep[r])
 
    #out.save(text+'.jpg')
    print text
    return text
getverify1('v1.jpg')
getverify1('v2.jpg')
getverify1('v3.jpg')
getverify1('v4.jpg')
完整代碼

 

 

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM