如何用Python为图像逐行生成边界框,解决Tesseract文本识别不准问题
问题修复方案
问题原因
pytesseract.image_to_data返回的结果包含多个层级的识别单元,level字段对应不同粒度:
- level=1:整页
- level=2:文本块
- level=3:段落
- level=4:文本行
- level=5:单个单词
你现有代码未过滤层级,只要检测到非空文本就画框,会把所有单词级别的边界框全部绘制,因此无法得到逐行框选效果。
优化调整说明
- 新增图像预处理步骤:转灰度、降噪、二值化,提升行边界识别准确率
- 过滤层级为4的行级识别结果,仅保留文本行的边界框
- 新增行区域裁剪、保存逻辑,可直接输出每行的单独jpeg文件
- 可选单独对每行文本做识别,提升整体识别准确率
完整修改后代码
import cv2 import pytesseract from pytesseract import Output # 配置tesseract路径 pytesseract.pytesseract.tesseract_cmd = r'C:\\ProgramData\\Tesseract-OCR\\tesseract.exe' # 读取图像,可替换为自身实际路径 img = cv2.imread('1.png') # 图像预处理:减少噪声干扰,提升行识别准确率 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (5,5), 0) thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 调用tesseract获取识别数据,lang参数可按需调整,比如中英文混合用'chi_sim+eng' d = pytesseract.image_to_data(thresh, output_type=Output.DICT, lang='eng') n_boxes = len(d['level']) line_count = 0 for i in range(n_boxes): # 仅保留行级、非空文本的边界框 if d['level'][i] == 4 and d['text'][i].strip() != "": (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) # 绘制行边界框 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) # 裁剪行区域 line_region = img[y:y+h, x:x+w] # 保存行区域为jpeg文件 cv2.imwrite(f'line_{line_count}.jpeg', line_region) # 可选:单独识别该行文本,准确率更高 line_text = pytesseract.image_to_string(line_region, lang='eng') print(f"第{line_count}行识别结果:{line_text.strip()}") line_count += 1 # 展示带框的结果 cv2.imshow('行识别结果', img) cv2.waitKey(0) cv2.destroyAllWindows()
参数调整提示
如果行识别效果不符合预期,可以调整image_to_data的config参数,添加--psm分页模式配置:
config='--psm 3':默认自动分页,适用于常规排版文档config='--psm 6':假设图像为单块统一文本,适用于排版规整的表格/单据config='--psm 12':稀疏文本模式,可识别任意顺序的文本行,适用于排版零散的图像
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

