使用 Python 和 Tesseract 实现英文数字验证码识别
在本教程中,我们将使用 Python 和 Tesseract OCR 引擎来识别英文数字验证码。通过结合一些图像处理技巧,如灰度化、二值化和去噪,我们可以显著提高验证码识别的准确性。
- 环境准备
首先,您需要安装 Tesseract OCR 引擎和 Python 库。如果尚未安装,请按照以下步骤进行设置。
(1)安装 Tesseract OCR 引擎
Linux 系统:
更多内容访问ttocr.com或联系1436423940
sudo apt-get update
sudo apt-get install tesseract-ocr
macOS 系统:
brew install tesseract
Windows 系统:
下载并安装 Tesseract OCR
,并确保安装路径已经添加到系统的环境变量中。
(2)安装 Python 库
使用 pip 安装 pytesseract 和 Pillow 库:
pip install pytesseract pillow numpy opencv-python
pytesseract 用于将 Tesseract 引擎与 Python 集成。
Pillow 是一个图像处理库,用于加载和处理图像文件。
numpy 和 opencv-python 用于图像处理,提升验证码识别的效果。
- 代码实现
下面是实现验证码识别的 Python 代码。我们将使用 Pillow 进行图像加载,使用 OpenCV 进行图像预处理,然后使用 Tesseract OCR 来识别数字验证码。
(1)导入所需的库
import pytesseract
from PIL import Image
import cv2
import numpy as np
(2)配置 Tesseract 路径(Windows 系统)
在 Windows 系统中,如果 Tesseract 没有自动添加到 PATH 环境变量中,您需要手动指定 Tesseract 可执行文件的路径。
设置 Tesseract 可执行文件的路径
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # 根据您的安装路径调整
(3)图像预处理
我们将使用 OpenCV 进行一些图像预处理步骤,如将图像转换为灰度图、二值化图像以及去噪,帮助提高 OCR 识别的准确性。
def preprocess_image(image_path):
# 读取图像
image = cv2.imread(image_path)
# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用二值化处理图像
_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 应用去噪(可选)
denoised = cv2.fastNlMeansDenoising(binary, None, 3, 7, 21)
return denoised
灰度化:通过将图像转换为灰度图像,我们减少了颜色信息的干扰,专注于形状和纹理。
二值化:通过将图像转换为黑白二值图像,我们使得字符更加清晰易识别。
去噪:通过去除图像中的噪点,使得字符边缘更加明显,从而提高识别准确性。
(4)识别验证码
使用 Tesseract OCR 来识别图像中的字符,并输出识别的结果。
def recognize_captcha(image_path):
# 预处理图像
processed_image = preprocess_image(image_path)
# 转换为 PIL 图像对象,以便传递给 pytesseract
pil_image = Image.fromarray(processed_image)
# 使用 Tesseract 识别图像中的文本
text = pytesseract.image_to_string(pil_image, config='--psm 6')
return text
image_to_string 方法会从处理过的图像中提取文本,--psm 6 是 Tesseract 的页面分隔模式,它适用于有文本的图片。
(5)测试验证码识别
def main():
image_path = "captcha_image.png" # 替换为验证码图片的路径
result = recognize_captcha(image_path)
print("识别结果:", result)
if name == "main":
main()
- 进一步优化
(1)自适应二值化
如果验证码的背景比较复杂,传统的二值化可能效果不好。这时可以使用自适应阈值来提高效果。
def adaptive_thresholding(image):
# 使用自适应阈值化算法来增强图像
return cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
此方法根据图像的局部特性动态调整每个像素的阈值,可以有效处理复杂背景。
(2)字符分割
如果验证码图像中的字符是相互连接的,OCR 可能无法正确识别。在这种情况下,我们可以先进行字符分割,将字符单独提取出来,然后逐个识别。
def split_characters(image):
# 轮廓查找与字符分割
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
characters = []
for contour in contours:
# 获取字符的边界框
x, y, w, h = cv2.boundingRect(contour)
character = image[y:y+h, x:x+w]
characters.append(character)
return characters
此方法可以将图像中的字符分割开来,从而单独识别每个字符,减少字符间干扰。
浙公网安备 33010602011771号