使用 PHP 和 Tesseract OCR 进行验证码识别


一、背景介绍
PHP 作为一种后端服务器脚本语言,广泛用于 Web 开发。结合 Tesseract OCR,我们可以在服务器端进行验证码识别,适用于自动化处理和数据爬取等场景。

二、环境准备
2.1 安装 Tesseract OCR
在 Linux 环境下安装 Tesseract:

sudo apt update
sudo apt install tesseract-ocr
验证安装:

tesseract --version
2.2 安装 PHP 和扩展
安装 PHP 和所需扩展:

sudo apt install php php-gd
三、代码实现
3.1 使用 Composer 安装 Tesseract OCR PHP 扩展
首先安装 Composer:

sudo apt install composer
然后安装 thiagoalessio/tesseract_ocr:

composer require thiagoalessio/tesseract_ocr
3.2 识别验证码的核心代码
创建一个名为 captcha_recognizer.php 的文件:

<?php

require __DIR__ . '/vendor/autoload.php';

use thiagoalessio\TesseractOCR\TesseractOCR;

// 预处理图像
function preprocessImage($imagePath, $outputPath) {
    // 将图像转换为灰度并进行二值化处理
    $cmd = "convert $imagePath -colorspace Gray -threshold 50% $outputPath";
    exec($cmd, $output, $status);
    if ($status === 0) {
        echo "图像预处理成功:$outputPath\n";
        return true;
    } else {
        echo "图像预处理失败:\n";
        print_r($output);
        return false;
    }
}

$imagePath = "captcha.png";  // 原始验证码图片
$processedImage = "processed_captcha.png";  // 处理后的图片

// 预处理验证码图像
if (preprocessImage($imagePath, $processedImage)) {
    // 使用 Tesseract 识别验证码
    $text = (new TesseractOCR($processedImage))
        ->lang('eng')
        ->psm(6)  // 假设单行文本
        ->allowlist('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')  // 只识别大写字母和数字
        ->run();

    echo "识别结果:$text\n";
} else {
    echo "图像预处理失败,无法继续识别。\n";
}
?>
四、运行程序
使用以下命令运行:

php captcha_recognizer.php
示例输出:

图像预处理成功:processed_captcha.png
识别结果:7F6HJ
五、性能优化
5.1 图像去噪和二值化
使用 ImageMagick 的 convert 命令进行图像预处理:

convert captcha.png -colorspace Gray -threshold 50% processed_captcha.png
5.2 设置白名单字符
仅识别大写字母和数字:

->allowlist('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
5.3 调整页面分割模式
对于单行验证码,设置 PSM 模式为 6:
更多内容访问ttocr.com或联系1436423940
->psm(6)
六、实际应用场景
自动化登录和验证

在自动化测试中,快速识别验证码并提交登录请求。

批量验证码识别

批量处理多个验证码图片,自动提取其中的文本内容。

数据爬虫和自动化填表

解决验证码问题,提高数据采集效率。