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

车牌OCR场景下Pytesseract将'Z'误识别为'7'的问题求助

车牌识别中pytesseract将'Z'误识别为'7'的问题

我正在用Python和OpenCV开发车牌识别系统,流程是从图像/视频帧提取并处理车牌区域,再用pytesseract做OCR。目前遇到的问题是:pytesseract频繁把字母'Z'误识别成数字'7'。

相关代码片段

import numpy as np
import cv2 as opencv
import pytesseract

class LicensePlateProcessor:
    @staticmethod
    def process_license_plate(frame, x1, y1, x2, y2):
        # ... [初始步骤:裁剪、灰度化、模糊、阈值化、反转] ...

        # 查找轮廓,计算面积并提取最大轮廓
        contours, _ = opencv.findContours(inverted_license_plate, opencv.RETR_TREE, opencv.CHAIN_APPROX_SIMPLE)
        areas = np.array([opencv.contourArea(contour) for contour in contours])
        max_index = np.argmax(areas)
        contour = contours[max_index]

        # 计算矩得到质心,围绕质心裁剪
        moments = opencv.moments(contour)
        m00 = np.array(moments['m00'])
        m10 = np.array(moments['m10'])
        m01 = np.array(moments['m01'])
        cx, cy = np.divide([m10, m01], m00, out=np.zeros_like([m10, m01]), where=m00 != 0)
        cx, cy = cx.astype(int), cy.astype(int)
        height, width = inverted_license_plate.shape[:2]
        offset = np.array([np.add(np.floor_divide(width, 2.961), 30), np.floor_divide(height, 4.972)]).astype(np.int32)
        rect_top_left = np.clip([cx - offset[0], cy - offset[1]], 0, None)
        rect_bottom_right = np.clip([cx + offset[0], cy + offset[1]], None, inverted_license_plate.shape[::-1])
        cropped_image = inverted_license_plate[rect_top_left[1]:rect_bottom_right[1], rect_top_left[0]:rect_bottom_right[0]]

        # 对裁剪后的图像执行OCR
        recognized_text = pytesseract.image_to_string(lang='en', cropped_image, config='--psm 13 --oem 3')

        return recognized_text

# 使用示例
frame = opencv.imread('license_plate_image.jpg')
recognized_plate = LicensePlateProcessor.process_license_plate(frame, x1, y1, x2, y2)
print(recognized_plate)

我已经尝试在传入pytesseract前做灰度化、模糊、阈值化、反转等预处理,但问题依然存在。

处理后的裁剪图像

车牌裁剪图

不清楚为什么tesseract会把'Z'判定为'7',考虑针对车牌的标准字体训练tesseract,但不知道该字体的名称。


解决建议

  • 修正代码参数错误:pytesseract.image_to_string的参数顺序有误,正确顺序应为图像在前,语言参数在后,修改为:

    recognized_text = pytesseract.image_to_string(cropped_image, lang='en', config='--psm 13 --oem 3')
    
  • 优化pytesseract识别配置

    • 限定字符集:在config中添加字符白名单,减少识别范围,只保留车牌可能出现的字符:
      --psm 13 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      
    • 调整PSM模式:如果裁剪后的是完整车牌(多行/单行),可尝试更合适的PSM模式,比如--psm 7(单行文本)或--psm 8(单个词),替代当前的--psm 13(单个字符识别)。
  • 强化图像预处理

    • 形态学闭合操作:用结构元素填充字符边缘的小缺口,让字符轮廓更清晰:
      kernel = opencv.getStructuringElement(opencv.MORPH_RECT, (2, 2))
      cropped_image = opencv.morphologyEx(cropped_image, opencv.MORPH_CLOSE, kernel)
      
    • 自适应阈值:替换固定阈值,应对光照不均的情况:
      # 假设已得到灰度图gray
      adaptive_thresh = opencv.adaptiveThreshold(gray, 255, opencv.ADAPTIVE_THRESH_GAUSSIAN_C, opencv.THRESH_BINARY_INV, 11, 2)
      
    • 倾斜矫正:通过轮廓的最小外接矩形检测字符倾斜,进行旋转矫正,确保字符水平对齐。
  • 字体识别与自定义训练

    • 识别字体:使用在线字体识别工具上传车牌截图,确定字体名称(比如常见车牌字体如License Plate、Arial Narrow等)。
    • 训练自定义模型:收集该字体的字符样本,生成tesseract训练数据集,训练专属语言包,提升特定字体的识别准确率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:50:31