为何Pytesseract无法识别黑底白字?代码运行异常求助
解决Pytesseract识别黑底白字图片的问题
首先咱们得明确:Tesseract OCR默认是针对白底黑字的图片优化的,黑底白字的图片直接识别很容易出问题,这是你当前遇到的核心问题之一。另外裁剪后识别为空,大概率是缺少必要的预处理步骤,或者裁剪后的图片特征不够明显。
下面给你几个亲测有效的解决步骤:
1. 反转图片颜色(核心操作!)
把黑底白字转成白底黑字,完全贴合Tesseract的默认识别逻辑。用PIL的ImageOps.invert()就能轻松实现:
import pytesseract from PIL import Image, ImageOps pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract' im = Image.open('topLine.png') # 反转颜色:黑底白字 → 白底黑字 inverted_im = ImageOps.invert(im) print(pytesseract.image_to_string(inverted_im))
2. 增加预处理强化文本特征
如果反转后还是有乱码或识别不全的情况,可以加上二值化处理,把图片转成纯黑白(只有0和255的像素值),进一步过滤噪点、强化文本边缘:
import pytesseract from PIL import Image, ImageOps pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract' im = Image.open('topLine.png') # 反转颜色 inverted_im = ImageOps.invert(im) # 二值化处理(阈值可根据你的图片调整,127是通用分界值) threshold = 127 binary_im = inverted_im.point(lambda x: 0 if x < threshold else 255, '1') print(pytesseract.image_to_string(binary_im))
3. 针对裁剪后图片的优化方案
如果你裁剪了图片但识别为空,大概率是裁剪后的文本太小,或者Tesseract没启用适配单行文本的配置,可以试试这两个操作:
- 放大裁剪后的图片(用
resize()方法放大2-3倍,保持比例),让文本特征更清晰; - 给Tesseract加上单行文本识别的配置参数,减少误判:
# 配置参数:--psm 7 表示把输入当成单行文本处理,--oem 3 用默认OCR引擎 custom_config = r'--oem 3 --psm 7' print(pytesseract.image_to_string(binary_im, config=custom_config))
4. 额外检查项
如果你的文本包含特殊字符或非英文内容,要确保Tesseract安装了对应的语言包,识别时可以通过lang参数指定,比如lang='eng'(英文)。
最后再提一句:如果裁剪后的图片文本特别小,放大操作是必须的——Tesseract对过小的文本识别率会急剧下降。
内容的提问来源于stack exchange,提问作者sprogissd
相关产品推荐
相关产品推荐

