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

Tesseract识别含未知符号文本返回空串问题求助

解决Tesseract识别被圆圈信息符号干扰的问题

我来分享几个实用的解决方案,帮你避开这个圆圈符号带来的识别问题:

1. 预处理阶段直接移除圆圈符号

既然圆圈是固定的圆形图案,我们可以用OpenCV的霍夫圆检测找到它,然后用白色填充(和背景一致),这样Tesseract就只会看到目标文字了。

在你的代码里,转灰度之后添加这段处理逻辑:

# 检测图像中的圆形符号
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1.2, minDist=20,
                           param1=50, param2=30, minRadius=5, maxRadius=20)
if circles is not None:
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        # 用白色填充圆圈区域,覆盖符号
        cv2.circle(gray, (i[0], i[1]), i[2], (255, 255, 255), -1)

你可以根据实际圆圈的大小,调整minRadius和maxRadius参数,确保能精准检测到你的目标符号。

2. 给Tesseract设置字符白名单

这个方法最简单直接——告诉Tesseract只识别你需要的字符类型,忽略其他奇怪的符号。比如如果你的目标文字是字母和数字,就添加白名单配置:

修改OCR的调用代码:

text = pytesseract.image_to_string(gray, config='--psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ')

这样即使圆圈被识别成乱码或者导致部分异常,Tesseract也会只保留白名单内的字符,不会返回空串。

3. 识别后过滤结果

如果前两种方法还有残留问题,可以在得到识别结果后做一次过滤,只保留你需要的内容:

text = pytesseract.image_to_string(gray, config='--psm 7')
# 定义允许保留的字符集合(根据你的需求调整)
allowed_chars = set('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ')
# 过滤掉非允许字符并去除首尾空白
filtered_text = ''.join([c for c in text if c in allowed_chars]).strip()
print("Output: " + filtered_text)

这样不管识别出什么奇怪的符号,都会被过滤掉,只留下干净的目标文字。

4. 裁剪掉符号所在的固定区域

如果圆圈总是出现在文字的固定位置(比如右侧),可以直接裁剪掉那部分区域,只保留文字部分:

# 获取图像宽度
width = gray.shape[1]
# 裁剪掉右侧10%的区域(比例根据实际情况调整)
cropped_gray = gray[:, :int(width*0.9)]
# 之后用cropped_gray代替gray做OCR
filename = "{}.png".format(os.getpid())
cv2.imwrite(filename, cropped_gray)
text = pytesseract.image_to_string(cropped_gray, config='--psm 7')

这个方法最直接,从根源上避开符号干扰。

推荐先试试字符白名单的方法,简单易实现;如果效果不够理想,再尝试预处理移除圆圈的方案,能彻底解决符号问题。

内容的提问来源于stack exchange,提问作者csi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:25:55