神器!使用Python 輕鬆識別驗證碼

霍格沃兹测试开发学社發表於2024-05-12

前言

在我們進行自動化測試的過程中,免不了要在登入時遇到驗證碼,很多時候我們都是隻能找開發要萬能驗證碼或者暫時關閉驗證碼這個功能,但是有時候我們必須要驗證碼是否能夠正常生成,所以在這個時候,我們需要做的就是輸入驗證碼,但是驗證碼這個東西是隨機生成的,不是每一次都一樣,所以我們還是需要識別然後輸入,指令碼是沒有眼睛的,只能透過程式碼來進行識別,所以本文就來給大家介紹一下如何使用Python來輕鬆識別數字驗證碼。

安裝Python庫和軟體環境

驗證碼識別需要用到一些Python庫和軟體環境,下面將介紹它們的安裝步驟。

  1. 安裝Tesseract OCR

它是一個開源的光學字元識別引擎,用於識別驗證碼中的文字內容,能夠識別70多種語言的文字,併為開發者提供簡單易用的API。可以透過以下連結下載和安裝:https://github.com/tesseract-ocr/tesseract 。在Windows系統下可以下載exe檔案進行安裝。

注:Tesseract安裝完成後需要將tesseract.exe檔案路徑加入系統的環境變數,否則無法在Python指令碼中呼叫。

  1. 所需Python庫

驗證碼識別需要使用的Python庫包括:pillow(PIL)pytesseractopencv-python。pillow為Python自帶的標準庫,其它庫可以使用pip命令自動安裝:

pip install pytesseract
pip install opencv-python

識別簡單的數字驗證碼

  1. 準備驗證碼圖片

首先,我們需要準備一些驗證碼圖片。可以在網路上搜尋驗證碼圖片進行下載,或者使用Python的爬蟲程式去爬取目標網站的驗證碼。這裡我們先手動下載一個簡單的數字驗證碼圖片,儲存為“test.jpg”。

  1. 載入驗證碼圖片

我們可以使用Pillow庫(Python Imaging Library)載入驗證碼圖片。Pillow庫可以讀取和處理不同類別的圖片格式,如jpg、png、bmp等等。程式碼如下:

from PIL import Image
img = Image.open('test.jpg')
img.show()
  1. 識別驗證碼

使用pytesseract庫,我們可以很容易地把圖片中的數字識別出來。pytesseract庫依賴於Tesseract OCR引擎,能夠處理各種難度的驗證碼,如數字、字母、漢字、傾斜、變形等等。程式碼如下:

import pytesseract
text = pytesseract.image_to_string(Image.open('test.jpg'), lang='eng')
print(text)

這段程式碼的意思是用pytesseract庫將圖片中的字串轉換為字元。lang引數可以指定識別的語言型別,這裡我們使用了eng,表示英文。如果驗證碼是漢字,設定為chi_sim即可。

識別數字字母混合的驗證碼

當驗證碼中既包含數字又包含字母時,需要對識別的方法進行修改,下面介紹一種簡單的處理方法,即透過二值化和降噪處理來增加識別率。

二值化處理

二值化處理就是將圖片中的所有畫素轉換為黑白兩種顏色。對於驗證碼圖片,我們可以將其轉換為黑白灰度影像,便於後續的處理。程式碼如下:

import cv2
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Image', threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()

這段程式碼用OpenCV庫將圖片讀取為灰度影像,並進行二值化處理。其中,127是閾值,值越小,黑色部分就越多,白色部分就越少。執行後可以得到二值化後的圖片。

降噪處理

在二值化後,圖片中仍有一些噪點和干擾線條。如果不處理這些噪聲,將會影響後續的字元識別,因此需要進行降噪處理,將圖片中的噪點和干擾線條消除。程式碼如下:

import cv2
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
blur = cv2.GaussianBlur(threshold,(5,5),0)
cv2.imshow('Image', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

這段程式碼使用高斯濾波函式對圖片進行平滑處理,消除噪聲和干擾線條。其中(5,5)指定核的大小,值越大,平滑效果越明顯。執行後可以得到處理後的圖片。

識別驗證碼

對於數字和字母混合的驗證碼,我們需要對每個字元進行識別。可以採用字元分割的方法,將驗證碼圖片分割成單個字元圖片,再進行字元識別。程式碼如下:

import pytesseract
import cv2
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
blur = cv2.GaussianBlur(threshold, (5,5), 0)
contours, hierarchy = cv2.findContours(blur, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
count = 0
for contour in contours:
    (x,y,w,h) = cv2.boundingRect(contour)
    if w > 10 and h > 10:
        roi = blur[y:y+h, x:x+w]
        cv2.imwrite(str(count)+'.jpg', roi)
        text = pytesseract.image_to_string(roi, lang='eng')
        print(text)
        count += 1
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

這段程式碼先對圖片進行二值化和降噪處理,然後使用findContours函式找到並分割出每個字元的邊緣輪廓。再使用boundingRect函式得到每個字元的位置和大小,並使用image_to_string函式對每個字元進行字元識別。執行程式碼後,可以看到輸出結果為分割出的每個字元及其識別結果。

總結

本文介紹瞭如何使用 Python 和相關庫來識別數字驗證碼。透過這種方法,我們可以實現驗證碼的自動識別,用於自動化測試、爬蟲程式或其他需要驗證碼處理的場景。在實際應用中,可以根據具體的需求對識別方法進行進一步最佳化和調整,以獲得更好的識別效果。

相關文章