Tesseract图像文本识别出错,预处理后仍误判,求解决方案
Tesseract识别特殊字体(Shentox)出错的解决办法
我尝试从图像中提取白色文本(忽略红色文本),虽然已经把图像处理成了较好的格式,但Tesseract还是输出错误结果。运行代码后,正确文本应该是“CW9-1Y”,却被识别成了“CWS-1Y”。已知所用字体是Shentox,但训练Tesseract适配该字体难度较大,求解决办法。
相关图像
- 原始图像:

- 处理后图像:

运行代码
import cv2 as cv import pytesseract from PIL import Image image = cv.imread("screenshot.png", cv.IMREAD_GRAYSCALE) ret, modified_image = cv.threshold(image, 120, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU) modified_image= cv.resize(modified_image, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC) #cv.imshow("image", image) #cv.imshow("modified_image", modified_image) cv.imwrite("modified_image.png", modified_image) pytesseract.pytesseract.tesseract_cmd = r'C:\Tesseract-OCR\tesseract.exe' text = pytesseract.image_to_string(Image.open('modified_image.png'), config="--psm 6 --oem 3", lang="eng") print(f'Text: {text}')
可行解决思路
1. 优化图像预处理
当前的二值化和放大已经做了基础处理,可以再试试这些调整:
- 去掉手动指定的阈值120,仅保留
cv.THRESH_BINARY_INV + cv.THRESH_OTSU,让算法自动计算最优阈值,避免手动阈值干扰。 - 添加降噪处理:用
cv.medianBlur(modified_image, 3)或cv.GaussianBlur去除图像中的微小噪点,减少对字符识别的干扰。 - 尝试形态学操作:用
cv.erode(腐蚀)或cv.dilate(膨胀)规整字符边缘,让“9”的轮廓更清晰,降低和“S”的混淆概率。
2. 限制Tesseract的识别字符集
既然目标文本是字母+数字+短横的固定格式,直接指定允许识别的字符集,过滤无关字符,大幅降低识别错误率。修改代码中的config参数:
text = pytesseract.image_to_string(Image.open('modified_image.png'), config="--psm 6 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-", lang="eng")
3. 调整PSM识别模式
当前使用的PSM 6是“假设图像为单一均匀块的文本”,可以试试更贴合短文本场景的模式:
- PSM 7:假设图像为单行文本,更适配当前的短字符串。
- PSM 10:假设图像为单个字符,可配合字符分割循环识别每个字符。
示例修改为PSM 7:
text = pytesseract.image_to_string(Image.open('modified_image.png'), config="--psm 7 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-", lang="eng")
4. 自定义字符模板匹配
如果以上方法仍无效,可直接用OpenCV的模板匹配避开Tesseract的字体问题:
- 从处理后的图像中截取“9”的清晰区域作为模板图像。
- 遍历目标图像的字符区域,用
cv.matchTemplate进行匹配,通过匹配得分判断字符是否为“9”。
内容的提问来源于stack exchange,提问作者Andreas Ellsen
相关产品推荐
相关产品推荐

