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

如何优化pytesseract OCR识别,过滤无效字符仅提取姓名与数字?

优化pytesseract OCR提取姓名与数字的方案

一、图片预处理(消除边框干扰)

用OpenCV对图片做二值化和降噪处理,弱化边框这类无效元素的影响:

import cv2
import pytesseract

# 读取目标图片
img = cv2.imread("your_image.png")
# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化(调整阈值过滤浅色调边框)
_, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
# 去除小噪声
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
cleaned_img = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

二、调整pytesseract识别参数

指定识别的字符范围,同时设置合适的页面分割模式(PSM),从根源减少无效识别:

# 配置参数:锁定中文、数字字符集,设置PSM为单行文本识别(可根据图片排版调整)
custom_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist="一二三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟万0123456789\u4e00-\u9fa5"'

# 识别预处理后的图片
text = pytesseract.image_to_string(cleaned_img, config=custom_config, lang='chi_sim')

三、后处理过滤无效数据

用正则表达式提取符合格式的姓名和数字,彻底排除像EE--这类无效内容:

import re

# 匹配2-4字中文姓名+数字的组合,可根据实际排版调整正则规则
pattern = re.compile(r'([\u4e00-\u9fa5]{2,4})\s*(\d+)')
results = pattern.findall(text)

# 输出最终提取结果
for name, num in results:
    print(f"姓名:{name},数字:{num}")

补充调整建议

  • 若姓名和数字是分行排版,把PSM参数改成--psm 6(按区块识别文本)
  • 可根据图片实际明暗调整二值化的阈值(cv2.threshold里的200),确保边框被完全过滤
  • 若涉及生僻姓或复姓,可针对性扩展白名单内的汉字范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:26:17