使用Python和Tesseract實(shí)現(xiàn)驗(yàn)證碼識(shí)別功能
一、驗(yàn)證碼識(shí)別的背景與難點(diǎn)
1.1 什么是驗(yàn)證碼?
驗(yàn)證碼(CAPTCHA, Completely Automated Public Turing test to tell Computers and Humans Apart)是一種區(qū)分用戶是人類還是計(jì)算機(jī)程序的技術(shù)。常見的驗(yàn)證碼類型包括:
- 文本驗(yàn)證碼:圖片中包含扭曲或噪聲干擾的字符。
- 圖片驗(yàn)證碼:用戶需要選擇特定內(nèi)容的圖片。
- 行為驗(yàn)證碼:要求用戶拖動(dòng)滑塊或完成特定任務(wù)。
1.2 驗(yàn)證碼識(shí)別的應(yīng)用場(chǎng)景
- 自動(dòng)化測(cè)試:繞過驗(yàn)證碼驗(yàn)證,以便進(jìn)行完整的自動(dòng)化測(cè)試。
- 數(shù)據(jù)采集:識(shí)別網(wǎng)頁中的驗(yàn)證碼,自動(dòng)登錄或提交表單。
- 輔助功能:為視障用戶提供驗(yàn)證碼讀取功能。
1.3 驗(yàn)證碼識(shí)別的挑戰(zhàn)
- 圖像噪聲:許多驗(yàn)證碼包含背景噪聲、干擾線條或色塊。
- 字符扭曲:為了增加識(shí)別難度,字符通常被扭曲或旋轉(zhuǎn)。
- 字符連體:字符之間的分隔不明確,需要精確分割。
二、Tesseract 簡(jiǎn)介
Tesseract 是一個(gè)由 Google 維護(hù)的開源 OCR 引擎,支持多種語言和字符識(shí)別。它可以通過 Python 的 pytesseract
庫調(diào)用,輕松實(shí)現(xiàn)文字識(shí)別功能。
2.1 Tesseract 的主要特點(diǎn)
- 多語言支持:Tesseract 支持超過 100 種語言。
- 易于擴(kuò)展:支持自定義訓(xùn)練,適應(yīng)特定場(chǎng)景的需求。
- 開源免費(fèi):無需授權(quán)費(fèi)用,適用于商業(yè)項(xiàng)目。
2.2 Tesseract 的核心流程
- 圖像預(yù)處理:將圖像轉(zhuǎn)化為適合 OCR 的格式。
- 文字區(qū)域檢測(cè):識(shí)別圖像中的文字區(qū)域。
- 字符識(shí)別:將文字區(qū)域的像素轉(zhuǎn)換為字符。
- 輸出文本:生成最終的文字結(jié)果。
三、環(huán)境準(zhǔn)備
在開始編碼之前,需要完成以下環(huán)境的配置。
3.1 安裝 Tesseract
1. Linux
sudo apt update sudo apt install tesseract-ocr sudo apt install libtesseract-dev
2. macOS
通過 Homebrew 安裝:
brew install tesseract
3. Windows
從 Tesseract 官方 GitHub 下載 Windows 安裝包,并配置環(huán)境變量。
3.2 安裝 Python 庫
安裝 pytesseract
和圖像處理相關(guān)庫:
pip install pytesseract pillow opencv-python
四、驗(yàn)證碼識(shí)別的實(shí)現(xiàn)
4.1 讀取并顯示圖片
我們將使用 Pillow
和 OpenCV
庫來加載和顯示驗(yàn)證碼圖片。
from PIL import Image import cv2 # 加載驗(yàn)證碼圖片 image_path = "captcha.png" image = cv2.imread(image_path) # 使用 OpenCV 顯示圖片 cv2.imshow("Captcha", image) cv2.waitKey(0) cv2.destroyAllWindows()
4.2 圖像預(yù)處理
為了提高識(shí)別率,我們需要對(duì)驗(yàn)證碼圖片進(jìn)行預(yù)處理,包括灰度化、二值化和噪聲去除。
1. 轉(zhuǎn)灰度圖像
灰度化將彩色 圖片轉(zhuǎn)換為黑白圖片,簡(jiǎn)化處理。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow("Gray Image", gray) cv2.waitKey(0) cv2.destroyAllWindows()
2. 二值化
二值化通過閾值將圖片轉(zhuǎn)換為黑白兩色,突出文字部分。
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) cv2.imshow("Binary Image", binary) cv2.waitKey(0) cv2.destroyAllWindows()
3. 去噪聲
使用形態(tài)學(xué)操作(如開運(yùn)算)去除圖片中的干擾點(diǎn)。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) denoised = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) cv2.imshow("Denoised Image", denoised) cv2.waitKey(0) cv2.destroyAllWindows()
4.3 調(diào)用 Tesseract 進(jìn)行識(shí)別
使用 pytesseract
調(diào)用 Tesseract 識(shí)別處理后的驗(yàn)證碼圖片。
import pytesseract from PIL import Image # 將處理后的圖片保存為臨時(shí)文件 cv2.imwrite("processed_captcha.png", denoised) # 使用 pytesseract 識(shí)別 text = pytesseract.image_to_string("processed_captcha.png", config="--psm 6") print(f"識(shí)別結(jié)果: {text}")
五、優(yōu)化識(shí)別效果
5.1 調(diào)整 Tesseract 參數(shù)
通過修改 Tesseract 的 --psm
參數(shù),可以改變文字布局分析模式,例如:
--psm 6
:假設(shè)為一個(gè)塊的文字。--psm 7
:將圖像作為一行文字處理。
5.2 設(shè)置白名單字符
如果驗(yàn)證碼的字符范圍已知,可以設(shè)置白名單,提高識(shí)別準(zhǔn)確率。
custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz' text = pytesseract.image_to_string("processed_captcha.png", config=custom_config) print(f"識(shí)別結(jié)果: {text}")
5.3 自定義訓(xùn)練模型
如果驗(yàn)證碼的字符樣式特殊,可以通過 Tesseract 的訓(xùn)練工具定制模型,以提升識(shí)別率。
六、完整代碼示例
以下是整合圖像預(yù)處理和驗(yàn)證碼識(shí)別的完整代碼:
import cv2 import pytesseract # 加載圖片 image_path = "captcha.png" image = cv2.imread(image_path) # 轉(zhuǎn)為灰度圖像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化處理 _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 去除噪聲 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) denoised = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) # 保存預(yù)處理后的圖片 cv2.imwrite("processed_captcha.png", denoised) # 使用 pytesseract 進(jìn)行文字識(shí)別 custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz' text = pytesseract.image_to_string("processed_captcha.png", config=custom_config) # 輸出識(shí)別結(jié)果 print(f"識(shí)別結(jié)果: {text}") # 顯示處理后的圖片 cv2.imshow("Processed Image", denoised) cv2.waitKey(0) cv2.destroyAllWindows()
七、總結(jié)
通過本文的介紹,我們學(xué)習(xí)了如何使用 Python 和 Tesseract 實(shí)現(xiàn)驗(yàn)證碼識(shí)別,并通過圖像預(yù)處理和參數(shù)優(yōu)化提高識(shí)別率。在實(shí)際項(xiàng)目中,結(jié)合深度學(xué)習(xí)模型可以進(jìn)一步提升復(fù)雜驗(yàn)證碼的識(shí)別效果。
以上就是使用Python和Tesseract實(shí)現(xiàn)驗(yàn)證碼識(shí)別功能的詳細(xì)內(nèi)容,更多關(guān)于Python Tesseract驗(yàn)證碼識(shí)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
wxpython多線程防假死與線程間傳遞消息實(shí)例詳解
今天小編就為大家分享一篇wxpython多線程防假死與線程間傳遞消息實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12python深度學(xué)習(xí)TensorFlow神經(jīng)網(wǎng)絡(luò)模型的保存和讀取
這篇文章主要為大家介紹了python深度學(xué)習(xí)TensorFlow神經(jīng)網(wǎng)絡(luò)如何將訓(xùn)練得到的模型保存下來方便下次直接使用。為了讓訓(xùn)練結(jié)果可以復(fù)用,需要將訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型持久化2021-11-11pycharm調(diào)試時(shí)顯示圖片問題的解決
這篇文章主要介紹了pycharm調(diào)試時(shí)顯示圖片問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04APIStar:一個(gè)專為Python3設(shè)計(jì)的API框架
今天小編就為大家分享一篇關(guān)于一個(gè)專為Python3設(shè)計(jì)的API框架:APIStar,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-09-09Python實(shí)現(xiàn)自動(dòng)識(shí)別數(shù)字驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了如何使用Python來自動(dòng)識(shí)別數(shù)字驗(yàn)證碼,以便在需要時(shí)自動(dòng)填寫或驗(yàn)證驗(yàn)證碼,有需要的小伙伴可以參考一下2024-04-04Python 統(tǒng)計(jì)列表中重復(fù)元素的個(gè)數(shù)并返回其索引值的實(shí)現(xiàn)方法
這篇文章主要介紹了Python 統(tǒng)計(jì)列表中重復(fù)元素的個(gè)數(shù)并返回其索引值,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05