使用 Python 和 OpenCV 进行验证码识别
验证码(CAPTCHA)是一种广泛用于网站注册、登录等场景的安全机制,旨在防止自动化脚本的滥用。本文将介绍如何使用 Python 结合 OpenCV 和 Tesseract OCR 来实现验证码识别。
- 环境准备
在开始之前,请确保你的环境中安装了以下软件和库:
安装 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. 代码解析
- 读取验证码图像
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 识别效果不好,可以尝试以下方法:
- 去噪处理
验证码图片中可能有干扰线或噪点,可以使用形态学操作进行降噪:
python
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
clean = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
这样可以减少小的噪点,使字符更加清晰。
- 设定字符白名单
如果验证码仅包含数字或大写字母,可以设置 Tesseract 只识别特定字符:
python
text = pytesseract.image_to_string(thresh, config="--psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
这样可以排除无关字符,提高识别准确率。
- 轮廓检测 + 字符分割
如果验证码字符之间间距较大,可以使用 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())
这可以帮助单独处理每个字符,提高识别的准确性。
- 运行代码
确保 captcha.png 在当前目录下,然后运行:
bash
python captcha_recognition.py
程序会输出识别的验证码,并显示处理后的图像
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异