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

使用pytesseract.image_to_string时输出含未知方框字符的问题求助

解决宝可梦卡牌OCR识别异常及CSV写入问题

一、图像预处理(减少空白区域干扰)

预处理是降低异常字符识别的核心,通过过滤噪声、强化文字对比度,让Tesseract只聚焦有效文字:

  • 二值化转换(将ROI转为黑白图,消除灰度噪声):
    import cv2
    # 读取ROI图像
    roi_img = cv2.imread("your_roi_image.png")
    # 转为灰度图
    gray = cv2.cvtColor(roi_img, cv2.COLOR_BGR2GRAY)
    # 自动阈值二值化(文字黑、背景白,可根据卡牌底色调整THRESH_BINARY/THRESH_BINARY_INV)
    _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    
  • 若图像有模糊,先加高斯模糊降噪:
    blur = cv2.GaussianBlur(gray, (3,3), 0)
    _, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    

二、调整Tesseract识别参数(精准限制识别范围)

Tesseract 4.x支持tessedit_char_whitelist参数,结合--psm模式可替代黑白名单:

  • 针对卡牌编号(数字+大写字母):
    import pytesseract
    # --psm 8:将图像视为单个词,适合已精准截取的ROI
    number_text = pytesseract.image_to_string(thresh, config='--psm 8 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    
  • 针对卡牌名称(字母+空格):
    name_text = pytesseract.image_to_string(thresh_name, config='--psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ')
    

三、识别结果后处理(清理异常字符与换行)

通过正则表达式过滤非目标字符,彻底清除方框、乱码:

import re
# 清理编号:只保留字母数字,去除首尾空白与换行
clean_number = re.sub(r'[^A-Z0-9]', '', number_text.strip())
# 清理名称:保留字母、空格,去除多余换行
clean_name = re.sub(r'[^A-Za-z ]', '', name_text.strip()).replace('\n', '')

四、CSV写入优化(避免换行与编码异常)

使用Python标准csv模块写入,避免手动拼接导致的格式问题:

import csv
# newline='' 避免自动添加多余换行,utf-8编码兼容特殊字符
with open('pokemon_cards.csv', 'a', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow([clean_name, clean_number])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:35:15