前言
最近在研究驗證碼相關的操作,所以準備記錄下安裝以及使用的過程。雖然之前對驗證碼的破解有所了解的,但是之前都是簡單使用之后就不用了,沒有記錄一個詳細的過程,所以后面再用起來也要重新從網上查找資料比較麻煩,所以這里準備對研究過程的關鍵點做一個記錄。
首先這篇文章,主要是研究圖形驗證碼,后期會不定時拓展內容。
在網上查了很多版本的圖形驗證碼識別,目前看到最多的兩個模塊是pytesseract和tesserocr,但是因為我這里安裝tesserocr的時候各種出錯,所以最終我鎖定了使用pytesseract。
那么接下來,就記錄下安裝以及使用過程。這里的系統環境是mac os 10.14.
安裝tesserocr
brew install tesserocr
因為pytesseract依賴于tesserocr所以首先需要先安裝tesserocr這個軟件。接下來就是安裝python相關的包
安裝python所需要的包
1
2
|
pip3 install pytesseract pip3 install pillow |
安裝pytesseract是ocr識別圖片上的字,因為驗證碼的識別難度高低不同,所以在這個過程中需要對圖片做一定的處理,這就需要使用處理圖片的模塊pillow。
一個簡單的demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import pytesseract from PIL import Image import os def binarizing(img, threshold): """傳入image對象進行灰度、二值處理""" pixdata = img.load() w, h = img.size # 遍歷所有像素,大于閾值的為黑色 for y in range (h): for x in range (w): if pixdata[x, y] < threshold: pixdata[x, y] = 0 else : pixdata[x, y] = 255 return img _temp = os.path.dirname(__file__) file_path = os.path.join(_temp, 'code2.jpg' ) print ( "file_path" , file_path) image = Image. open (file_path) image = image.convert( 'L' ) threshold = 157 table = [] # 接下來是二值化處理 # 遍歷所有像素,大于閾值的為黑色,threshold是閥值 image = binarizing(image, threshold) result = pytesseract.image_to_string(image) print (result) |
示例中的圖片
需要用到的圖像知識:
對于彩色圖像,不管其圖像格式是PNG,還是BMP,或者JPG,在PIL中,使用Image模塊的open()函數打開后,返回的圖像對象的模式都是“RGB”。而對于灰度圖像,不管其圖像格式是PNG,還是BMP,或者JPG,打開后,其模式為“L”也就是我們說的灰度化的一個操作。除此之外,還有其他的模式,不過我們在處理驗證碼的時候是將其轉為灰度模式,所以就不強調其他的模式了。
模式“L”
模式“L”為灰色圖像,它的每個像素用8個bit表示,0表示黑,255表示白,其他數字表示不同的灰度。在PIL中,從模式“RGB”轉換為“L”模式是按照下面的公式轉換的:
L = R * 299/1000 + G * 587/1000+ B * 114/1000
通過灰度化之后的圖片變為
灰度化我們還要對其進行二值化操作
二值化操作
二值化故名思議,就是整個圖像所有像素只有兩個值可以選擇,一個是黑(灰度為0),一個是白(灰度為255)。二值化的好處就是將圖片上的有用信息和無用信息區分開來,比如二值化之后的驗證碼圖片,驗證碼像素為黑色,背景和干擾點為白色,這樣后面對驗證碼像素處理的時候就會很方便。對于簡單的圖形驗證碼,到這里基本上就夠了,但是如果有干擾線,還要進行除干擾線的操作。
對應的代碼為
1
2
3
4
5
6
7
8
9
10
11
12
|
def binarizing(img, threshold): """傳入image對象進行灰度、二值處理""" pixdata = img.load() w, h = img.size # 遍歷所有像素,大于閾值的為黑色 for y in range (h): for x in range (w): if pixdata[x, y] < threshold: pixdata[x, y] = 0 #小于閥值設為0,0是黑色 else : pixdata[x, y] = 255 0 #大于閥值設為255,255是白色 return img |
此時的圖片效果為
可以看到圖片變得銳化了很多,這個時候再去識別就比較好識別了。
去干擾線
常見的4鄰域、8鄰域算法。所謂的X鄰域算法,可以參考手機九宮格輸入法,按鍵5為要判斷的像素點,4鄰域就是判斷上下左右,8鄰域就是判斷周圍8個像素點。如果這4或8個點中255的個數大于某個閾值則判斷這個點為噪音,閾值可以根據實際情況修改。
使用cv2處理
除此之外還可以使用cv2模塊進行處理。
安裝
pip install opencv-python
代碼示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# -*- coding: utf-8 -*- import cv2 import numpy as np import os _temp = os.path.dirname(__file__) file_path = os.path.join(_temp, 'code2.jpg' ) def remove_noise(img, k = 4 ): ###8領域過濾 img2 = img.copy() # img處理數據,k過濾條件 w, h = img2.shape def get_neighbors(img3, r, c): count = 0 for i in [r - 1 , r, r + 1 ]: for j in [c - 1 , c, c + 1 ]: if img3[i, j] > 10 : # 純白色 count + = 1 return count # 兩層for循環判斷所有的點 for x in range (w): for y in range (h): if x = = 0 or y = = 0 or x = = w - 1 or y = = h - 1 : img2[x, y] = 255 else : n = get_neighbors(img2, x, y) # 獲取鄰居數量,純白色的鄰居 if n > k: img2[x, y] = 255 return img2 img = cv2.imread(file_path) # 將圖片灰度化處理,降維,加權進行灰度化c gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) t, gray2 = cv2.threshold(gray, 200 , 255 , cv2.THRESH_BINARY) cv2.imshow( 'threshold' , gray2) result = remove_noise(gray2) cv2.imshow( '8neighbors' , result) cv2.waitKey( 0 ) #cv2.destroyAllWindows() |
總結
以上所述是小編給大家介紹的mac使用python識別圖形驗證碼功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
原文鏈接:https://www.cnblogs.com/c-x-a/p/12168010.html