如何提升截图场景下Tesseract OCR的识别准确率?
提升Tesseract识别Arial字体截图准确率的实用方案
嘿,我太懂你这种明明是常见的Arial黑底白字截图,Tesseract却乱码连连的糟心了!之前我处理类似场景时,试过不少方法,结合你提到的字体训练思路,给你整理一套落地的方案:
一、先试试低成本的预处理优化(不用训练也能救回不少准确率)
很多时候识别拉胯不是字体的锅,是截图的预处理没做到位,Tesseract对输入图片的要求其实挺挑的:
- 反转颜色:Tesseract默认对白底黑字的识别效果更好,黑底白字可以直接反转成标准格式。用Python的PIL或者OpenCV都能一键搞定:
# PIL示例 from PIL import Image, ImageOps img = Image.open("your_screenshot.png") inverted_img = ImageOps.invert(img) inverted_img.save("inverted.png") - 强制二值化:把图片转换成纯黑白(无灰度),彻底消除模糊干扰:
# OpenCV示例 import cv2 img = cv2.imread("inverted.png", 0) _, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) cv2.imwrite("binary.png", binary_img) - 放大字体:如果截图里的字体小于30px,Tesseract很容易认错,把图片放大1.5-2倍再识别,效果会明显提升:
resized_img = cv2.resize(binary_img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) - 去除噪声:如果截图有轻微的边框、阴影噪点,用中值滤波或者高斯模糊先清掉:
denoised_img = cv2.medianBlur(resized_img, 3)
二、终极方案:训练Arial专属的Tesseract模型
如果预处理后还是达不到要求,那自定义字体训练就是你的最优解,亲测能做到近乎100%的准确率,步骤如下:
1. 准备训练素材
- 生成和你截图字体完全匹配的样本:包括你需要识别的所有字符(数字、大小写字母、符号等),字体大小、样式(粗体/常规)要和截图一致。可以用Python脚本批量生成:
from PIL import Image, ImageDraw, ImageFont font_path = "path/to/arial.ttf" # 你的Arial字体文件路径 font = ImageFont.truetype(font_path, size=40) # 字体大小和截图匹配 chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" # 替换成你需要的字符 for idx, char in enumerate(chars): img = Image.new("L", (50, 50), 255) # 白底 draw = ImageDraw.Draw(img) draw.text((5, 5), char, font=font, fill=0) # 黑字 img.save(f"arial_sample_{idx}.png") - 尽量多生成一些样本,比如每个字符生成3-5种不同的轻微偏移版本,让模型更鲁棒。
2. 生成标注文件(.box)
每个样本图片需要对应一个.box文件,用来标注字符的位置和内容。你可以用Tesseract自带的tesseract命令自动生成后手动修正:
tesseract arial_sample_0.png arial_sample_0 batch.nochop makebox
打开生成的.box文件,格式是字符 左 上 右 下 0,确保每个标注都准确对应图片里的字符。
3. 启动训练
- 先安装Tesseract的训练工具包(比如Ubuntu下用
sudo apt install tesseract-ocr-training,Windows需要单独下载训练工具)。 - 用官方的
tesstrain.sh脚本训练,命令示例:
这个命令会基于英文训练集,加入Arial字体的样本,生成自定义的训练模型。tesstrain.sh \ --fonts_dir /usr/share/fonts \ --fontlist "Arial" \ --lang eng \ --linedata_only \ --langdata_dir ./langdata \ --tessdata_dir ./tessdata \ --output_dir ./arial_train_output
4. 使用自定义模型
训练完成后,会在输出目录得到arial_custom.traineddata(具体名称看你设置),把它复制到Tesseract的tessdata目录下,然后识别时指定这个模型:
tesseract your_processed.png output -l arial_custom
三、额外小技巧
- 如果你的截图是单行文本或者单个字符,用
--psm参数指定页面分割模式,能进一步提升准确率:# 单行文本用psm 7 tesseract your_img.png output -l arial_custom --psm 7 - 训练前可以先测试默认模型在预处理后的效果,如果已经能满足需求,就不用折腾训练了,省时间!
内容的提问来源于stack exchange,提问作者forever
相关产品推荐
相关产品推荐

