IPL pytesseract識別帶干擾驗證碼

2021-10-05 17:20:14 字數 3899 閱讀 4690

不包括神經網路,識別效果只有20%左右,不過我的需求是自動登陸,能夠滿足

最近想寫乙個自動登陸網頁的指令碼,但是發現目標網頁有驗證碼,所以就需要寫乙個東西去識別驗證碼

一開始使用的是pytesseract,可是這個pytesseract對於簡單的驗證碼識別還可以,但是對於這種帶干擾線的驗證碼就無能為力了。

(ps. 簡單的驗證碼就是字元跟字元之間沒有粘在一起,然後角度都是正的,分割出來,一句話說就是想列印的字型)

上圖其實是tesseract,不過pytessract也是python對tesseract的api封裝而已

在使用tesseract的時候,發現一些引數是十分重要的,比如 --psm 

tesseract your_picture.png your_output_file_name --psm 10

# 10 表示識別單一字元,對於只有乙個字元的時候很有效

還有像config目錄下面可以自定義自己想要輸出的字元,比如你想識別身份證,可以限制輸出的字元是0123456789x,這樣也能提高準確率。反正就是多看文件!多看文件!多看文件!文件裡啥都有,不要用了發現沒識別出來,就說人家的軟體不行,實在不行,我們還能進行一些預處理

後面就用ipl進行了預處理,包括降噪、灰度化、二值化、切割等:

# 展示驗證碼

def show_captcha(file_path):

img = image.open(file_path)

img.show()

# 灰度化

def to_gray(img):

img_gray = img.convert('l')

return img_gray

# 二值化

def to_binary(img, threshold=200):

table =

for i in range(256):

if i < threshold:

else:

img_binary = img.point(table, '1')

return img_binary

# 降噪

def reduce_noise(img):

img_data = np.array(img, dtype=np.uint8)

row, col = img_data.shape

for i in range(row):

for j in range(col):

count = 0

if img_data[i, j] != 255: # 255 white

# up search

up_i = i - 1

while up_i - 1 >= 0 and img_data[up_i, j] != 255:

count += 1

up_i -= 1

# down search

down_i = i + 1

while down_i + 1 <= row - 1 and img_data[down_i, j] != 255:

count += 1

down_i += 1

# clean

if count <= 3:

for tmp_i in range(up_i, down_i):

img_data[tmp_i, j] = 255

img_reduce_noise = image.fromarray(img_data.astype('uint8'))

return img_reduce_noise

# 修復

def fix(img):

img_data = np.array(img, dtype=np.uint8)

row, col = img_data.shape

for i in range(row):

for j in range(col):

if img_data[i, j] == 255:

up_j = j - 1

down_j = j + 1

if up_j >= 0 and down_j <= col - 1 and img_data[i, up_j] != 255 and img_data[i, down_j] != 255:

# fix

img_data[i, j] = 0

img_fix = image.fromarray(img_data.astype('uint8'))

return img_fix

def crop(img):

img_data = np.array(img, dtype=np.uint8)

row, col = img_data.shape

visited = {}

for j in range(col):

for i in range(row):

if img_data[i, j] == 0:

dfs(img_data, i, j, visited)

break

else:

continue

break

fx, fy = list(visited.keys())[0]

print(fx, fy)

up, down, left, right = fx, fx, fy, fy

for x, y in visited:

if y > right:

right = y

if y < left:

left = y

if x < up:

up = x

if x > down:

down = x

print(left, up, right, down)

img_crop = img.crop((left, up, right, down))

return img_crop

"""img_data 二維陣列

visited {}

"""def dfs(img_data, i, j, visited):

# find first point

row, col = img_data.shape

visited[(i, j)] = 1

if j - 1 >= 0 and img_data[i, j-1] == 0 and (i, j-1) not in visited:

dfs(img_data, i, j-1, visited)

if j + 1 <= col - 1 and img_data[i, j+1] == 0 and (i, j+1) not in visited:

dfs(img_data, i, j+1, visited)

if i - 1 >= 0 and img_data[i-1, j] == 0 and (i-1, j) not in visited:

dfs(img_data, i-1, j, visited)

if i + 1 <= row - 1 and img_data[i+1, j] == 0 and (i+1, j) not in visited:

dfs(img_data, i+1, j, visited)

再識今目標

認真的檢視了我的今目標使用情況,看到了我們一路走來的點點滴滴。發現我們已經使用今目標2年多了 2012.06.24開始 很驚訝!為什麼會這樣?乙個使用了2年多的工具 學習小助手應該更貼切些 到現在我還沒有將它融合到我們的生活中。或者說,沒有真正認識到它在我的學習歷程中地位。2年的成長,誰在為我們見證...

DeepFace Facebook的人臉識別

連續看了deepid和facenet後,看了更早期的一篇 即fb的deepface。這篇 早於deepid和facenet,但其所使用的方法在後面的 中都有體現,可謂是早期的奠基之作。因而特寫博文以記之。人臉識別的基本流程是 detect align represent classify分為如下幾步...

重識物件導向

最近的學習進行到了uml階段。上來的第一節課就是講的物件導向。很早以前公尺老師上課的時候就給我們講過了,雖然只是簡單的講解,但現在看起來還是讓我覺得受益匪淺。現在來談談我自己的理解 物件導向是一種軟體開發方法,是一種對現實世界理解和抽象的方法。既然是物件導向。那這個物件是什麼呢?物件其實就是我們要進...