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
相关产品推荐
相关产品推荐

