pytesseract识别异常咨询:同规格图片识别结果不一致
pytesseract识别差异的原因及解决办法
- 文本与背景的实际对比度差异:肉眼看起来背景相近,但某张图的文本灰度值和背景差太小(比如浅灰字配浅灰背景),OCR对这种低对比度的文本敏感度极低。你发的图里,无法识别的那张大概率存在这个问题。
- 字体/笔画特征问题:不同字体的笔画粗细、边缘清晰度不同,比如细字体、手写体或者边缘模糊的印刷体,OCR的字符检测模型难以提取有效特征,而粗体、清晰的印刷体更容易被识别。
- 缺少必要的图像预处理:pytesseract默认对"干净"的黑白二值图识别效果最好,直接用原图(尤其是带灰阶、噪点的图)识别很容易翻车。
实用解决步骤
- 强制做图像预处理,用OpenCV把图转成高对比度的黑白图:
import cv2 import pytesseract def preprocess(img_path): # 转灰度图 gray = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 自适应二值化,解决光照不均、低对比度问题 binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 中值滤波去噪 clean = cv2.medianBlur(binary, 3) return clean # 预处理后识别 result = pytesseract.image_to_string(preprocess("your_image.jpg"), lang="chi_sim") # 中文需指定lang参数,英文可省略 print(result)
- 检查语言包:如果识别中文,确认pytesseract是否安装了
chi_sim语言包,没装的话中文会无法识别。 - 校正轻微倾斜:哪怕看起来正的图,微小倾斜也会影响识别,可在预处理中加入倾斜校正:
import numpy as np # 接上面的preprocess函数,在二值化后添加: coords = np.column_stack(np.where(binary > 0)) angle = cv2.minAreaRect(coords)[-1] # 调整角度值 if angle < -45: angle = -(90 + angle) else: angle = -angle # 旋转校正 (h, w) = binary.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) binary = cv2.warpAffine(binary, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
内容的提问来源于stack exchange,提问作者sumanth kumar
相关产品推荐
相关产品推荐

