如何优化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
相关产品推荐
相关产品推荐

