You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Tesseract正确检测图像文本?Python脚本返回空串问题排查

问题分析与修复方案

一、脚本本身的变量错误

你的代码存在未定义变量的问题,这是导致输出异常的直接原因:

  • 函数参数为img,转成cvimg后,后续却使用了未定义的screen和screenGR变量,这会引发逻辑错误,无法正确处理图像。

二、Tesseract识别失败的核心原因及修复

除代码错误外,Tesseract对输入图像质量要求较高,测试图像大概率存在对比度不足、噪声干扰、文本尺寸过小等问题,且缺少必要的预处理步骤。

修复步骤

1. 修正代码变量错误

统一变量名,修正颜色通道转换逻辑(PIL转OpenCV后通道为RGB,需转为OpenCV默认的BGR):

import cv2
import pytesseract
import numpy as np
from PIL import Image

def getText(img): # 接收PIL.Image类型输入
    cvimg = np.array(img) 
    # 转换PIL的RGB通道为OpenCV的BGR通道
    cvimg = cv2.cvtColor(cvimg, cv2.COLOR_RGB2BGR)
    greyscale = cv2.cvtColor(cvimg, cv2.COLOR_BGR2GRAY) # 正确使用转换后的图像
    textFromImg = pytesseract.image_to_string(greyscale) # 基于灰度图识别
    
    return textFromImg.strip()

2. 添加图像预处理提升识别率

针对低质量图像,增加预处理步骤强化文本特征:

import cv2
import pytesseract
import numpy as np
from PIL import Image

def getText(img):
    cvimg = np.array(img)
    cvimg = cv2.cvtColor(cvimg, cv2.COLOR_RGB2BGR)
    greyscale = cv2.cvtColor(cvimg, cv2.COLOR_BGR2GRAY)
    
    # 1. 二值化:自动阈值分割,增强文本与背景对比度
    _, thresh_img = cv2.threshold(greyscale, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    # 2. 去噪:消除图像杂点干扰
    denoised_img = cv2.medianBlur(thresh_img, 3)
    
    # 3. 放大文本:针对小尺寸文本提升识别率
    height, width = denoised_img.shape
    if height < 100 or width < 300:
        denoised_img = cv2.resize(denoised_img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
    
    # 4. 指定识别语言(英文场景添加lang='eng',需确保已安装对应语言包)
    textFromImg = pytesseract.image_to_string(denoised_img, lang='eng')
    
    return textFromImg.strip()

3. 额外优化建议

  • 确认Tesseract已安装对应语言包(比如英文包可通过tesseract --list-langs查看)
  • 若图像存在倾斜,可添加霍夫变换检测文本角度并做旋转校正
  • 复杂背景场景下,替换二值化步骤为自适应阈值分割:cv2.adaptiveThreshold(greyscale, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

内容的提问来源于stack exchange,提问作者itm54

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:15:07