You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为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

火山引擎 最新活动