系统整体架构与技术选型1.1 分层架构设计系统采用两层解耦架构便于算法迭代与界面扩展算法核心层独立封装图像处理与识别逻辑与界面完全解耦包含预处理、定位、矫正、分割、分类五个子模块界面交互层基于PyQt5实现图形化客户端负责图像加载、结果可视化、操作控制通过接口调用算法层能力1.2 核心技术栈模块技术选型说明开发语言Python 3.10兼顾开发效率与库生态图像处理OpenCV 4.x提供完整的图像运算与特征提取能力分类算法SVM支持向量机小样本下分类效果稳定训练成本低图形界面PyQt5组件丰富跨平台兼容性好开发环境PyCharm集成调试与代码管理能力1.3 完整识别流水线系统按固定流水线处理输入图像各环节可独立调参优化图像尺寸归一化 → 灰度化与高斯去噪 → 边缘提取与形态学处理 → 轮廓候选区筛选 → 倾斜角度矫正 → HSV颜色校验 → 字符分割与归一化 → HOG特征提取 → SVM分类识别 → 结果输出二、车牌定位算法设计与实现车牌定位是系统准确率的第一道关口单一方法易受光照、背景干扰本方案采用「边缘特征筛选 颜色空间校验」的双重定位策略提升复杂场景下的召回率。2.1 图像预处理预处理的目标是抑制噪声、突出车牌区域特征为后续边缘检测做准备。尺寸归一化统一缩放图像分辨率降低运算量保证后续轮廓筛选阈值的通用性高斯模糊去噪使用5×5高斯核平滑图像抑制拍摄噪声避免伪边缘干扰顶帽变换增强通过开运算提取图像亮区细节抵消光照不均影响突出车牌字符区域import cv2import numpy as npdef image_preprocess(img, blur_ksize5):# 高斯模糊去噪if blur_ksize 0:img_blur cv2.GaussianBlur(img, (blur_ksize, blur_ksize), 0)else:img_blur img.copy()# 灰度化gray cv2.cvtColor(img_blur, cv2.COLOR_BGR2GRAY)# 顶帽变换增强亮区域抵消光照不均kernel np.ones((20, 20), np.uint8)img_tophat cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)img_enhance cv2.addWeighted(gray, 1, img_tophat, -1, 0)return gray, img_enhance2.2 边缘检测与候选区生成采用Canny算子提取边缘配合形态学闭运算连接离散边缘形成候选连通域。阈值采用Otsu自适应二值化适配不同光照场景闭运算使用横向长核强化车牌的水平矩形特征开运算去除细小噪点过滤无效边缘def edge_extract(img_enhance):# 自适应二值化_, binary cv2.threshold(img_enhance, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)# Canny边缘检测edges cv2.Canny(binary, 100, 200)# 形态学处理闭运算连接边缘开运算去噪kernel_close np.ones((4, 19), np.uint8)edges_close cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel_close)edges_open cv2.morphologyEx(edges_close, cv2.MORPH_OPEN, kernel_close)return edges_open2.3 轮廓筛选与倾斜矫正通过轮廓特征筛选候选车牌再通过仿射变换完成倾斜矫正面积筛选过滤面积过小的无效轮廓长宽比筛选车牌标准长宽比约为3:1设置2.0~5.5的容差区间倾斜矫正通过最小外接矩形获取倾斜角度使用仿射变换将车牌校正为水平状态def locate_plate_candidates(edges, min_area1000):contours, _ cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)candidates []for cnt in contours:area cv2.contourArea(cnt)if area min_area:continue# 获取最小外接矩形rect cv2.minAreaRect(cnt)(cx, cy), (w, h), angle rect# 统一宽高方向if w h:w, h h, wangle 90# 长宽比筛选ratio w / hif 2.0 ratio 5.5:candidates.append(rect)return candidates2.4 HSV颜色校验将候选区转换到HSV颜色空间通过色调、饱和度统计判断车牌颜色进一步排除非车牌区域同时为后续字符分割提供颜色反转依据。蓝牌H通道 100~124绿牌H通道 35~99黄牌H通道 11~34三、字符分割与特征提取3.1 字符分割策略字符分割采用「水平投影裁剪 垂直投影分割」的方案同时处理常见干扰水平投影统计每行像素和裁剪掉上下边缘空白区域锁定字符行范围垂直投影统计每列像素和通过波峰波谷分割单个字符干扰处理去除车牌边框与铆钉干扰跳过省份简称与字母间的分隔点处理汉字宽度大于字母数字的特性单独适配第一个字符分割阈值3.2 字符归一化分割后的字符尺寸不一需统一缩放到固定尺寸如20×20再提取特征。为避免缩放变形采用等比例缩放边界填充的方式保证字符形态不变。3.3 HOG特征提取采用方向梯度直方图HOG作为字符特征相比原始像素特征具备更强的鲁棒性。将字符图像划分为4个cell每个cell计算16维梯度方向直方图采用Hellinger核做归一化提升分类器效果def extract_hog_features(char_imgs):features []for img in char_imgs:# 计算x、y方向梯度gx cv2.Sobel(img, cv2.CV_32F, 1, 0)gy cv2.Sobel(img, cv2.CV_32F, 0, 1)mag, ang cv2.cartToPolar(gx, gy)bin_n 16bin np.int32(bin_n * ang / (2 * np.pi))# 分4块统计直方图bin_cells bin[:10,:10], bin[10:,:10], bin[:10,10:], bin[10:,10:]mag_cells mag[:10,:10], mag[10:,:10], mag[:10,10:], mag[10:,10:]hists []for b, m in zip(bin_cells, mag_cells):hists.append(np.bincount(b.ravel(), m.ravel(), bin_n))hist np.hstack(hists)# Hellinger归一化eps 1e-7hist / hist.sum() epshist np.sqrt(hist)hist / np.linalg.norm(hist) epsfeatures.append(hist)return np.float32(features)