为OCR优化图片:万智牌名称识别程序的识别异常与OpenCV图像格式问题求助
问题分析与解决方案
首先,你的两个问题其实是关联的:图像数据类型不正确既导致了cv2.imshow的报错,也让Tesseract无法正确识别文本。
1. 解决cv2.imshow的格式错误问题
你用(imgT >= 165)*255生成的new_imgT,其数据类型并不是OpenCV期望的uint8(8位无符号整数)。这个表达式会生成布尔数组或32位整数数组,而OpenCV的imshow只支持8位无符号或32位浮点类型的图像,因此触发了src_depth != CV_16F && src_depth != CV_32S的断言错误。
虽然该数组能保存为PNG(保存时会自动转换格式),但内存中的数据类型不符合OpenCV和Tesseract的处理要求。修复方法很简单,只需将数组强制转换为uint8类型:
import numpy as np # 记得导入numpy库 def readCard(path): imgG = cv2.imread(path, 0) # 0表示灰度图 imgT = cv2.resize(imgG, (745, 1040))[55:100, 55:680] # 转换为OpenCV支持的uint8类型 new_imgT = ((imgT >= 165)*255).astype(np.uint8) cv2.imwrite(r"C:\Users\tpixe\Documents\PYTESSERACT test\mask.png", new_imgT) # 现在可以正常显示图像了 cv2.imshow("Processed Title", new_imgT) cv2.waitKey(0) cv2.destroyAllWindows() text = pytesseract.image_to_string(new_imgT) print(text)
2. 修复Tesseract识别异常的问题
之前返回♀这类奇怪字符,本质是Tesseract读取了非预期格式的图像数据。修复数据类型后,识别效果会有所改善,你还可以通过以下优化进一步提升准确率:
- 指定语言和识别模式:万智牌标题是英文单行文本,给Tesseract添加针对性参数能大幅提高识别精度:
其中text = pytesseract.image_to_string(new_imgT, lang='eng', config='--psm 6')--psm 6表示假设输入为单一均匀的文本块,完美匹配卡牌标题的场景。 - 调整阈值或改用自适应阈值:当前的165阈值可能不是最优值,你可以尝试调整数值,或者用
cv2.adaptiveThreshold处理不同光照条件下的卡牌图像:new_imgT = cv2.adaptiveThreshold(imgT, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) - 轻微形态学处理:通过膨胀/腐蚀消除噪点,让文本边缘更清晰:
kernel = np.ones((1,1), np.uint8) new_imgT = cv2.morphologyEx(new_imgT, cv2.MORPH_CLOSE, kernel)
总结
先解决图像数据类型的基础问题,再通过Tesseract参数调整和图像预处理优化识别逻辑,应该就能得到正确的"Command Beacon"结果了。
内容的提问来源于stack exchange,提问作者PixelmonMaster




