You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:00:15