如何用PyTesseract约束字符边界框合并以正确识别分离数字
解决PyTesseract数字OCR合并问题的方法
针对你遇到的数字被错误合并的问题,这里有几个无需过多手动干预的解决思路:
1. 调整Tesseract页面分割模式(PSM)
Tesseract的默认页面分割模式可能会把相邻的数字串识别为一个整体,尝试切换到适合稀疏文本的模式:
修改config参数,加入--psm 11(针对稀疏分散的文本,会优先识别独立的文本块):
num_text = pytesseract.image_to_string(processed_frame, config="--psm 11 outputbase digits -c tessedit_char_whitelist=0123456789") numbers = [int(x) for x in num_text.split()] return numbers
如果效果不佳,还可以尝试--psm 7(将图像视为单行文本)或--psm 8(识别单个词),根据你的图像实际情况调整。
2. 优化图像预处理
数字间隙过小或图像对比度不足是导致合并的常见原因,通过OpenCV增强图像特征:
import cv2 # 转灰度图(如果原图像不是灰度) gray = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2GRAY) # 二值化,自动计算阈值增强对比 _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 形态学开运算,清理噪点并轻微拉开数字间隙 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1)) processed_frame = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) # 再进行OCR识别 num_text = pytesseract.image_to_string(processed_frame, config="outputbase digits -c tessedit_char_whitelist=0123456789") numbers = [int(x) for x in num_text.split()] return numbers
可以根据实际情况调整形态学操作的kernel大小,比如(2,1)来进一步拉开横向间隙。
3. 利用image_to_data基于位置分割数字
如果前两种方法无效,可通过Tesseract返回的字符位置信息,自动判断数字串的边界:
import pytesseract from pytesseract import Output ocr_data = pytesseract.image_to_data(processed_frame, config="outputbase digits -c tessedit_char_whitelist=0123456789", output_type=Output.DICT) numbers = [] current_num = "" prev_right = 0 # 设定间距阈值,超过则视为新数字串(可根据图像分辨率调整) gap_threshold = 5 for idx in range(len(ocr_data['text'])): text = ocr_data['text'][idx].strip() if text.isdigit(): current_left = ocr_data['left'][idx] current_right = current_left + ocr_data['width'][idx] # 若当前数字和前一个数字间距超过阈值,保存当前累积的数字 if current_num and (current_left - prev_right) > gap_threshold: numbers.append(int(current_num)) current_num = text else: current_num += text prev_right = current_right # 保存最后一个数字串 if current_num: numbers.append(int(current_num)) return numbers
这个方法无需手动提取单个边界框,通过字符位置的间距自动拆分合并的数字。
内容的提问来源于stack exchange,提问作者Minuano
相关产品推荐
相关产品推荐

