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

