PyTesseract识别紧邻字符出错,求正确识别姓名的解决方法
解决PyTesseract识别姓名时的字符误判问题
针对你遇到的FORREST C. BLODGETT被识别为FORREST C. BLopGetTrT的问题,结合字符间距、大小写尺寸差异的推测,可从图像预处理和Tesseract参数优化两方面入手修复:
一、优化图像预处理
- 形态学操作修正字符边缘
二值化后通过形态学闭运算填补字符间隙,同时强化字符轮廓,避免因间距过近导致的字符粘连或误判:
from pytesseract import image_to_string import pytesseract import cv2 import numpy as np pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' img = cv2.imread("textimg.png") (h, w) = img.shape[:2] img = cv2.resize(img, (w*20, h*20)) gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) thr = cv2.threshold(gry, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 添加形态学闭运算优化字符轮廓 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) thr = cv2.morphologyEx(thr, cv2.MORPH_CLOSE, kernel) txt = image_to_string(thr, lang="eng") print(txt)
- 伽马校正增强对比度
通过调整图像伽马值,拉大字符与背景的亮度差,弱化大小写尺寸差异带来的识别干扰:
# 在灰度转换后添加伽马校正 gamma = 1.5 invGamma = 1.0 / gamma table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8") gry = cv2.LUT(gry, table)
二、调整Tesseract识别参数
- 指定字符白名单
姓名仅包含大写字母、空格和英文点,限制识别范围可直接过滤错误的小写字符:
# 添加config参数指定白名单和文本块模式 txt = image_to_string(thr, lang="eng", config='--psm 6 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZ ."')
其中--psm 6表示将输入视为单一均匀文本块,适合结构化的姓名列表场景。
- 单行识别模式(适用于每行一个姓名的场景)
如果图片中每个姓名单独占一行,使用--psm 7强制单行识别,进一步提升精准度:
txt = image_to_string(thr, lang="eng", config='--psm 7 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZ ."')
内容的提问来源于stack exchange,提问作者Mengyang Cao
相关产品推荐
相关产品推荐

