詳解Python驗證碼識別

2022-09-28 09:06:15 字數 4831 閱讀 5595

以前寫過乙個刷校內網的人氣的工具,j**a的(以後再也不行j**a程式了),裡面用到了驗證碼識別,那段**不是我自己寫的:-) 校內的驗證是完全單色沒有任何幹撓的驗證碼,識別起來比較容易,不過從那段**中可以看到基本的驗證碼識別方式。這幾天在寫乙個程式的時候需要識別驗證碼,因為程式是python寫的自然打算用python進行驗證碼的識別。

以前沒用python處理過影象,不太了解pil(python image library)的用法,程式設計客棧這幾天看了看pil,發現它太強大了,簡直和imagemagic,ps可以相比了。(這裡有pil不錯的文件)

由於上面的驗證碼是24位的jpeg影象,並且包含了噪點,所以我們要做的就是去噪和去色,我拿ps找了張驗證碼試了試,使用ps濾鏡中的去噪效果還行, 但是沒有在pil找到去噪的函式,後來發現中值過濾後可以去掉大部分的噪點,而且pil裡有現成的函式,接下來我試著直接把影象轉換為單色,結果發現還是 會有不過的噪點留了下來,因為中值過濾時把不少噪點淡化了,但轉換為音色時這些噪點又被強化顯示了,於是在中值過濾後對影象亮度進行加強處理,然後再轉換 為單色,這樣驗證碼就變得比較容易識別了:

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

接下來就是提取這些數字的字模,使用shell指令碼**100幅,抽出三張獲取字模:

#!/usr/bin/env pygtuaqqapkjthon

#encoding=utf-8

import image,imageenhance,imagefilter

import sys

image_name = "./images/81.jpeg"

im = image.open(image_name)

im = im.filter(imagefilter.medianfilter())

enhancegtuaqqapkjr = 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.wwww.cppcns.comrite("]/n")

把字模儲存為list,用於接下來的匹配;

提取完字模後剩下來的就是對需要處理的進行與資料庫中的字模進行匹配了,基本的思路就是看相應點的重合率,但是由於噪點的影響在對(6,8) (8,3)(5,9)的匹配時容易出錯,俺自己針對已有的100幅資料採集進行分析,採用了雙向匹配(與字模分別作為基點),做了半天的測試終於 可以實現100%的識別率。

#!/usr/bin/env python

#encoding=utf-8

import image,imageenhance,imagefilter

imp程式設計客棧ort 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")

這裡再提一下驗證碼識別的基本方法:截圖,二值化、中值濾波去噪、分割、緊縮重排(讓高矮統一)、字型檔特徵匹配識別。

這裡只是針對一般的驗證碼,高階驗證碼的識別這裡有篇不錯的文章,太複雜的話涉及的東西就多了,那俺就沒興趣了,人工智慧(好恐怖),俺只喜歡簡單的東西。

本文標題: 詳解python驗證碼識別

本文位址:

Python 驗證碼識別

使用pip安裝pytessseract,如圖所示 例項 識別該中的字元 指令碼 import os os.chdir c python34 lib site packages pytesser from pytesser import from pytesseract import image to...

python 驗證碼識別

一 python識別簡單驗證碼 1 2 func 實現簡單驗證碼獲取 3 4import pytesseract 5from pil import image67 首先通過image開啟乙個 9 然後通過方法將image物件轉化為字串10 code pytesseract.image to stri...

python驗證碼識別

驗證碼識別 識別驗證碼的操作 人工肉眼的識別 第三方自動識別 雲打碼 模擬登入 爬取基於某些基於使用者的使用者資訊.需求 對人人網進行模擬登入 點選登入按鈕之後會發起乙個post請求 post請求中會攜帶登陸之前錄入的相關的登入資訊 使用者名稱,密碼,驗證碼.驗證碼 每次請求都會變化 需求 爬取當前...