Pytesseract无法识别指定PNG图片文本 提取ishSilver及(SLV)问题咨询
解决思路
- 补充图像预处理流程
你当前仅做了图片裁剪操作,目标区域的文字对比度偏低、字号偏小,直接识别准确率差,建议补充以下处理步骤:- 将裁剪后的图像转为灰度图,再通过阈值二值化操作把文字和背景完全分离
- 对裁剪后的区域做2-3倍的放大,提升Tesseract对小字号的识别适配性
- 可添加简单的中值滤波操作消除图片噪点,避免干扰识别结果
- 优化Tesseract识别参数
- 增加
--psm参数指定识别模式,你裁剪后的区域为单行文本,指定psm=7(将图像视为单行文本处理)可以大幅提升准确率 - 增加字符白名单限制,你仅需要识别英文字母、括号,通过
-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz()限定识别范围,排除无关字符干扰
- 增加
- 验证裁剪范围准确性
先把裁剪后的im1保存到本地,确认裁剪区域是否完整包含ishSilver (SLV)的全部内容,避免内容被截断导致识别失败
修改后参考代码
from PIL import Image import pytesseract pytesseract.pytesseract.tesseract_cmd = r'C:\Tesseract-OCR\tesseract.exe' im = Image.open('Images/' + '1680.png') width, height = im.size # 可微调裁剪范围,避免内容截断 left = width * 0.87 top = 0 right = width bottom = height im1 = im.crop((left, top, right, bottom)) # 图像预处理:放大、转灰度、二值化 im1 = im1.resize((im1.size[0]*3, im1.size[1]*3), Image.Resampling.LANCZOS) # 3倍放大 im1 = im1.convert('L') # 转灰度图 threshold = 127 # 可根据实际图片亮度调整阈值 im1 = im1.point(lambda p: 255 if p > threshold else 0) # 二值化 # 优化识别参数,指定单行模式+字符白名单 custom_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz()' text = pytesseract.image_to_string(im1, lang="eng", config=custom_config).strip() print(text) print("\n") ticker = text[text.find("(")+1:text.find(")")] print(ticker)
内容的提问来源于stack exchange,提问作者Ed George
相关产品推荐
相关产品推荐

