談談Python進行驗證碼識別的一些想法

2022-09-28 09:06:15 字數 2396 閱讀 1457

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

一、處理

這個驗證碼中主要的影響因素是中間的曲線,首先考慮去掉中的曲線。考慮了兩種演算法:

第一種是首先取到曲線頭的位置,即x程式設計客棧=0時,黑點的位置。然後向後移動x的取值,觀察每個x下黑點的位置,判斷前後兩個相鄰黑點之間的距離,如果距離在一定範圍內,可以基本判斷該點是曲線上的點,最後將曲線上的點全部繪成白色。試了一下這種方法,結果得到的效果很一般,曲線不能完全去除,而且容量將字元的線條去除。

第二種考慮用單位面積內點的密度來進行計算。於是首先計算單位面積內點的個數,將單位面積內點個數少於某一指定數的面積去除,剩餘的部分基本上就是驗證碼字元的部分。本例中,為了便於操作,取了5*5做為單位範圍,並調整單位面積內點的標準密度為11。處理後的效果:

二、字元驗證

這裡我使用的方法是利用pytesser進行ocr識別,但由於這類驗證碼字元的不規則性,使得驗證結果的準確性並不是很高。具體哪位大牛,有什麼好的辦法,希望能給指點一下。

三、準備工作與**例項

1、pil、pytesser、tess程式設計客棧eract

(1)安裝pil:**位址:

(2)pytesser:**位址:**解壓後直接放在**相同的資料夾下,即可使用。

(3)tesseract ocr engine**:**後解壓,找到tessdata資料夾,用其替換掉pytesser解壓後的tessdata資料夾即可。

2、具體**

#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個點,那麼將該部分全部換為白色。

def ocrend():##識別

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

本文標題: 談談python進行驗證碼識別的一些想法

本文位址: /jiaoben/python/141072.html

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請求中會攜帶登陸之前錄入的相關的登入資訊 使用者名稱,密碼,驗證碼.驗證碼 每次請求都會變化 需求 爬取當前...