验证码识别是一个常见的技术应用,可以用于自动化登录、爬虫等场景。本文将介绍如何通过 PHP 和 Tesseract OCR 实现验证码的自动识别。Tesseract 是一个强大的开源 OCR 工具,支持多种语言的文本识别。
1. 环境准备
安装 Tesseract OCR
在开始之前,需要确保系统已经安装 Tesseract OCR:
Windows:从 Tesseract OCR 官方页面下载安装包。
Linux:运行以下命令安装:
bash
sudo apt install tesseract-ocr
macOS:通过 Homebrew 安装:
bash
brew install tesseract
安装完成后,运行以下命令确保安装成功:
bash
tesseract --version
2. 配置 PHP 环境
确保你已安装 PHP,并可以运行 PHP 脚本。接下来,安装 imagick 扩展,用于处理图像(如验证码的预处理)。
安装 imagick 扩展
Linux:
bash
sudo apt install php-imagick
Windows:在 PHP 配置文件 (php.ini) 中启用 extension=imagick,然后重启服务器。
3. 编写验证码识别代码
以下是一个 PHP 示例代码,展示如何通过 Tesseract OCR 识别验证码图像:
示例代码
php
<?php
// 设置验证码图像路径
$imagePath = "captcha.png";
// 图像预处理函数
function preprocessImage($inputPath, $outputPath) {
// 创建 Imagick 对象
$image = new Imagick($inputPath);
// 转换为灰度图像
$image->modulateImage(100, 0, 100);
// 应用二值化处理
$image->thresholdImage(128);
// 保存处理后的图像
$image->writeImage($outputPath);
echo "图像已处理并保存为: $outputPath\n";
}
// 预处理图像
$processedImage = "processed_captcha.png";
preprocessImage($imagePath, $processedImage);
// 调用 Tesseract OCR 进行文字识别
$output = null;
$returnVar = null;
exec("tesseract $processedImage output -l eng", $output, $returnVar);
// 读取识别结果
if (file_exists("output.txt")) {
$text = file_get_contents("output.txt");
echo "识别的验证码是: " . trim($text) . "\n";
} else {
echo "未能识别验证码。\n";
}
?>
4. 图像预处理
为了提高 OCR 的识别准确率,对验证码进行预处理非常重要。以下是一些常用的图像处理方法:
灰度化:将彩色图像转换为灰度图像,减少颜色干扰。
二值化:将图像转为黑白图像,使字符更突出。
去噪:移除背景噪点或干扰线条。
上述代码中的 preprocessImage 函数已经实现了灰度化和二值化处理。
5. 提高识别准确率
指定字符集
如果验证码只包含特定字符,可以通过 Tesseract 的白名单设置来限制识别范围:
bash
exec("tesseract $processedImage output -l eng --psm 7 tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
调整页面分割模式
Tesseract 支持多种页面分割模式,可以根据验证码的特点选择合适模式。例如,--psm 7 表示将图片识别为一行文本。
分割图像
如果验证码中的字符间距较大,可以先将图像分割成多个小图,再分别进行识别。
自定义训练模型
对于复杂的验证码,可以使用 Tesseract 提供的训练工具生成专用模型。
6. 运行代码
将代码保存为 captcha_recognition.php,确保验证码图片 captcha.png 位于同一目录中。然后运行以下命令:
bash
php captcha_recognition.php
运行成功后,程序会输出识别的验证码结果,例如:
makefile
更多内容访问ttocr.com或联系1436423940
图像已处理并保存为: processed_captcha.png
识别的验证码是: X7A9B