下面我用**「原理 → 技术路线 → 实战代码 → 提升识别率 → 常见坑」**的方式,系统讲清楚
👉 PHP 使用 OCR 技术识别图片文字的完整方案
一、OCR 是怎么工作的?(先有全局认知)
**OCR(Optical Character Recognition,光学字符识别)**核心流程:
- 图像预处理(灰度化、去噪、二值化)
- 文字区域检测
- 字符切割
- 字符识别(CNN / Transformer)
- 后处理(纠错、语言模型)
👉 PHP 不负责训练模型,只负责 调用 OCR 引擎 / API
二、PHP 可选的 OCR 技术路线(重点)
方案对比一览
| 方案 | 准确率 | 成本 | 适合场景 |
|---|---|---|---|
| Tesseract(本地) | ⭐⭐⭐⭐ | 免费 | 服务器可控 |
| 百度 OCR API | ⭐⭐⭐⭐⭐ | 按量 | 中文强 |
| 腾讯云 OCR | ⭐⭐⭐⭐⭐ | 按量 | 表格/票据 |
| 阿里云 OCR | ⭐⭐⭐⭐ | 按量 | 商用 |
| PaddleOCR(本地) | ⭐⭐⭐⭐⭐ | 免费 | 最高准确率 |
三、方案一:PHP + Tesseract(本地 OCR,最常用)
1️⃣ 安装 Tesseract
Ubuntu / Debian
sudo apt install tesseract-ocr
sudo apt install tesseract-ocr-chi-sim
Mac(Homebrew)
brew install tesseract
brew install tesseract-lang
2️⃣ PHP 调用 Tesseract
直接命令行方式(最稳定)
$image = 'test.png';
$output = 'result';
exec("tesseract $image $output -l chi_sim+eng");
$text = file_get_contents($output . '.txt');
echo $text;
3️⃣ 使用 PHP 封装库(推荐)
composer require thiagoalessio/tesseract_ocr
use thiagoalessio\TesseractOCR\TesseractOCR;
$text = (new TesseractOCR('test.png'))
->lang('chi_sim', 'eng')
->run();
echo $text;
4️⃣ 优点 / 缺点
✅ 免费
✅ 可离线
❌ 对模糊、歪斜图片不友好
❌ 需要预处理图片
四、方案二:PHP + 百度 OCR API(中文最强)
1️⃣ 开通 OCR 服务
- 百度智能云 → 文字识别
- 获取
API Key/Secret Key
2️⃣ 获取 Access Token
function getAccessToken() {
$url = 'https://aip.baidubce.com/oauth/2.0/token';
$params = [
'grant_type' => 'client_credentials',
'client_id' => 'API_KEY',
'client_secret' => 'SECRET_KEY',
];
return json_decode(file_get_contents($url.'?'.http_build_query($params)), true)['access_token'];
}
3️⃣ 调用通用文字识别
$image = base64_encode(file_get_contents('test.jpg'));
$token = getAccessToken();
$url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=$token";
$post = http_build_query(['image' => $image]);
$result = file_get_contents($url, false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded",
'content' => $post
]
]));
$data = json_decode($result, true);
$text = array_column($data['words_result'], 'words');
echo implode("\n", $text);
4️⃣ 适合场景
- 中文文档
- 手机拍照
- 模糊图片
- 商业系统
五、方案三:PHP + PaddleOCR(准确率天花板)
思路
PHP 不直接跑 OCR
👉 PHP 调用 Python PaddleOCR 服务(HTTP)
架构示意
PHP → HTTP → Python OCR 服务 → JSON 结果
Python OCR 服务示例
from paddleocr import PaddleOCR
from flask import Flask, request, jsonify
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
app = Flask(__name__)
@app.route('/ocr', methods=['POST'])
def ocr_api():
file = request.files['image']
file.save('tmp.jpg')
result = ocr.ocr('tmp.jpg', cls=True)
return jsonify(result)
app.run(port=5000)
PHP 用 cURL 调用即可
六、提升 OCR 识别率的关键技巧(非常重要)
1️⃣ 图片预处理(PHP + Imagick)
$img = new Imagick('test.png');
$img->setImageColorspace(Imagick::COLORSPACE_GRAY);
$img->thresholdImage(0.6 * Imagick::getQuantum());
$img->writeImage('clean.png');
2️⃣ 常见预处理手段
| 方法 | 作用 |
|---|---|
| 灰度化 | 降噪 |
| 二值化 | 提升对比 |
| 去斜 | 防止歪字 |
| 裁剪 | 聚焦文字 |
| 放大 2x | 提升清晰度 |
七、常见 OCR 失败原因(避坑)
❌ 图片太小(< 300px)
❌ 强反光 / 阴影
❌ 花纹背景
❌ 字体过于艺术化
❌ 语言模型未指定(chi_sim)
八、该怎么选?(快速建议)
| 需求 | 推荐 |
|---|---|
| 免费 / 离线 | Tesseract |
| 中文高精度 | 百度 OCR |
| 票据 / 表格 | 腾讯云 |
| 极致准确 | PaddleOCR |
九、一句话总结
PHP 本身不做 OCR,真正做 OCR 的是引擎;PHP 的价值是“稳定地调用 + 高效地处理结果”