使用 Python 和 OpenCV 进行验证码识别

验证码(CAPTCHA)是一种广泛用于网站注册、登录等场景的安全机制,旨在防止自动化脚本的滥用。本文将介绍如何使用 Python 结合 OpenCV 和 Tesseract OCR 来实现验证码识别。

  1. 环境准备
    在开始之前,请确保你的环境中安装了以下软件和库:

安装 Tesseract OCR
Tesseract 是一个开源的 OCR(光学字符识别)引擎,我们需要先安装它。

Windows:从 Tesseract 官方 GitHub 下载并安装,并确保将安装路径(如 C:\Program Files\Tesseract-OCR)添加到环境变量中。
Linux:
bash
更多内容访问ttocr.com或联系1436423940
sudo apt-get install tesseract-ocr
macOS:
bash

brew install tesseract
安装完成后,可以通过以下命令检查 Tesseract 是否可用:

bash

tesseract --version
安装 Python 及相关依赖
我们需要使用 OpenCV 进行图像处理,并使用 pytesseract 调用 Tesseract 进行 OCR 识别:

bash

pip install opencv-python numpy pytesseract
2. 代码实现
下面是一段 Python 代码,主要完成以下任务:

读取验证码图像
进行灰度化处理
进行二值化处理,提高识别效果
使用 Tesseract OCR 进行识别
python

import cv2
import pytesseract

设置 Tesseract OCR 的安装路径(Windows 用户需要指定路径)

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # 修改为你的 Tesseract 安装路径

读取验证码图像

image = cv2.imread("captcha.png")

转换为灰度图像

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

应用二值化处理(自适应阈值)

thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

使用 Tesseract 进行 OCR 识别

text = pytesseract.image_to_string(thresh, config="--psm 7")

print("识别的验证码是:", text.strip())

显示处理后的图片

cv2.imshow("Processed Image", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 代码解析

  1. 读取验证码图像
    python

image = cv2.imread("captcha.png")
这里的 imread 方法用于读取图像,确保 captcha.png 放在代码所在目录。
2. 预处理图像(灰度化 + 二值化)
python

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
灰度化:通过 cvtColor(image, cv2.COLOR_BGR2GRAY) 转换为灰度图像,减少颜色干扰。
二值化:使用 adaptiveThreshold 方法将图像转换为黑白,提高 OCR 识别的准确性。
3. 识别验证码
python

text = pytesseract.image_to_string(thresh, config="--psm 7")
pytesseract.image_to_string() 用于从图像中提取文本,--psm 7 代表处理单行文本模式,适用于验证码识别。
4. 显示处理后的图像
python

cv2.imshow("Processed Image", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
这部分代码用于显示处理后的验证码图像,方便我们观察 OCR 识别前的图像效果。
4. 提高识别准确率
如果 OCR 识别效果不好,可以尝试以下方法:

  1. 去噪处理
    验证码图片中可能有干扰线或噪点,可以使用形态学操作进行降噪:

python

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
clean = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
这样可以减少小的噪点,使字符更加清晰。

  1. 设定字符白名单
    如果验证码仅包含数字或大写字母,可以设置 Tesseract 只识别特定字符:

python

text = pytesseract.image_to_string(thresh, config="--psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
这样可以排除无关字符,提高识别准确率。

  1. 轮廓检测 + 字符分割
    如果验证码字符之间间距较大,可以使用 OpenCV 进行字符分割:

python

contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
roi = thresh[y:y+h, x:x+w] # 提取单个字符
char = pytesseract.image_to_string(roi, config="--psm 10")
print("单个字符:", char.strip())
这可以帮助单独处理每个字符,提高识别的准确性。

  1. 运行代码
    确保 captcha.png 在当前目录下,然后运行:

bash

python captcha_recognition.py
程序会输出识别的验证码,并显示处理后的图像

posted @   ttocr、com  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示