优化Tesseract实现手机拍摄照片中数字的可靠识别
Tesseract手机照片数字识别优化指南
问题背景
我是Tesseract新手,尝试识别手机拍摄照片中的数字。目前使用tesseract、textcleaner.sh及bash脚本处理,核心脚本代码如下:
for PSM in 6 11 3 do printf "CURRENT PSM is %d\n" "${PSM}" READ_CXX_ID=$(tesseract --psm ${PSM} "${file}" - | grep -oh "\w*0b79\w*" | tr -d '\n') if [ -z ${READ_CXX_ID} ] then printf "Couldn't read cxx ID for ${file} \n" printf "Lets check if converted file exists...\n" if [ ! -e "${file}.out.jpg" ] then printf "textcleaner not applied, lets create it...\n" # Here we will create JPG file instead of JPEG # So that it will not try to get CXX ID from the previous conversion ./textcleaner.sh -f 200 -i 1 ${file} "${file}.out.jpg" fi READ_CXX_ID=$(tesseract --psm ${PSM} "${file}.out.jpg" - | grep -oh "\w*0b79\w*" | tr -d '\n') if [ -z ${READ_CXX_ID} ] then printf "Even with textcleaner, ${PSM} couldn't read file..\n" printf "OCR ERROR , TRYING NEXT PSM...\n"
当前识别问题
已尝试调整不同PSM参数、用textcleaner预处理图像,但1000+张照片的识别成功率仅约75%。部分样本识别结果异常:
- sample-1用
--psm 1执行时提示字符过少,无法识别 - sample-2用
--psm 6执行时输出冗余内容,仅部分正确 - sample-3用
--psm 6执行时出现多余的“46”,末尾字符识别为问号而非9
环境信息
当前使用的Tesseract版本:
$ tesseract --version tesseract 5.1.0-72-gb8b6 leptonica-1.79.0 libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 2.0.3) : libpng 1.6.37 : libtiff 4.1.0 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.3.1 Found AVX2 Found AVX Found FMA Found SSE4.1 Found OpenMP 201511 Found libarchive 3.4.0 zlib/1.2.11 liblzma/5.2.4 bz2lib/1.0.8 liblz4/1.9.2 libzstd/1.4.4 Found libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3
无效尝试
试过模糊处理但无效果,操作及结果如下:
$ convert -blur 0x1 sample-1.jpeg sample-1.blurred.jpeg $ tesseract sample-1.jpeg - Estimating resolution as 251 x Trying to OCR this number $ tesseract sample-1.blurred.jpeg - Estimating resolution as 314 ¥ Trying to OCR this number $
优化方案
1. 必须加入自动倾斜校正
手机拍摄的照片几乎都会存在倾斜,这是影响Tesseract识别精度的核心因素之一,必须加入自动倾斜校正步骤。用ImageMagick的convert工具结合deskew功能实现:
convert ${file} -deskew 40% ${file}.deskewed.jpg
参数40%是允许的最大倾斜角度阈值,可根据实际样本调整(推荐范围30%-50%)。处理后的图像再交给textcleaner或直接用于OCR。
2. 优化图像预处理流程
当前textcleaner的参数适配性不足,调整预处理顺序和参数:
- 先做倾斜校正,再执行textcleaner处理,避免预处理失效
- 调整textcleaner参数:增加对比度(
-c)、调整阈值(-t),示例:
./textcleaner.sh -f 200 -i 1 -c 10 -t 50 ${file}.deskewed.jpg ${file}.out.jpg
- 低分辨率图像先放大:添加
-s 2参数将图像放大2倍,提升字符清晰度
3. 优化Tesseract参数
- 指定字符白名单:因为目标是识别字母数字组合,直接限定识别范围减少干扰:
tesseract --oem 3 --psm 6 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "${input_file}" -
- 调整PSM策略:调整循环顺序,优先用
--psm 6(假设单一文本块),再试--psm 8(单一单词)、--psm 10(单一字符),最后用--psm 11(稀疏文本)和--psm 3(默认) - 明确OEM模式:添加
--oem 3确保启用LSTM引擎,这是Tesseract 5.x的核心识别引擎
4. 脚本逻辑优化
- 预处理步骤前置:先完成倾斜校正+textcleaner处理,再执行OCR,避免重复尝试
- 避免重复生成文件:先检查是否存在倾斜校正后的文件,再进行后续处理
- 归档失败样本:把识别失败的文件单独移动到指定目录,后续针对性分析调整参数
5. 针对性处理异常样本
- sample-1字符过少:改用
--psm 8或--psm 10,同时确保图像放大到足够清晰 - sample-2冗余内容:用更严格的字符白名单,或添加textcleaner的
-e参数擦除小斑点干扰 - sample-3字符错误:增加去噪步骤(
convert ${file} -noise 3 ...),或调整textcleaner的滤波参数
内容的提问来源于stack exchange,提问作者Sertac TULLUK
相关产品推荐
相关产品推荐

