车牌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(单个字符识别)。
- 限定字符集:在config中添加字符白名单,减少识别范围,只保留车牌可能出现的字符:
强化图像预处理
- 形态学闭合操作:用结构元素填充字符边缘的小缺口,让字符轮廓更清晰:
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
相关产品推荐
相关产品推荐

