Matlab基于阈值分割的车牌定位识别。 车牌识别主要包括以下三个主要步骤车牌区域定位、车牌字符分割、车牌字符识别。 通过对采集的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程来进行车牌图像预处理并由此得到一种基于车牌颜色纹理特征的车牌定位方法最终实现了车牌区域定位。 车牌字符分割是为了方便后续对车牌字符进行匹配从而对车牌进行识别。 采用了模板匹配的方法对输出的字符图像和模板库里的模板进行匹配以得到对应于车牌字符的具体信息。 代码可正常运行先上预处理三板斧。拿到车牌图片先灰度化降维打击img imread(car_plate.jpg); gray rgb2gray(img); gray imadjust(gray); % 对比度增强这里有个坑——直接edge检测可能扑街。试过用Sobel算子找边缘但噪声太多。改成先腐蚀后膨胀的组合拳se strel(rectangle,[3,3]); eroded imerode(gray, se); % 啃掉边缘毛刺 edge_img edge(eroded,log); % 带抗噪的LoG检测这时候车牌区域边缘基本能连成片了但可能有零散小区域。用区域面积过滤stats regionprops(bwlabel(edge_img),Area,BoundingBox); areas [stats.Area]; [~,idx] max(areas); plate_region stats(idx).BoundingBox; % 抓取最大连通区域定位到车牌后字符分割才是重头戏。垂直投影法实测比水平投影靠谱特别是对付倾斜车牌plate_img imcrop(gray, plate_region); binary imbinarize(plate_img, graythresh(plate_img)*0.8); % 阈值调低点 vertical_proj sum(binary, 1); % 垂直方向像素累加处理投影曲线时阈值动态调整避免粘连字符split_points find(vertical_proj max(vertical_proj)*0.2); % 动态切割点 char_boxes []; prev 1; for k 1:length(split_points) if split_points(k)-prev 3 % 过滤过窄间隙 char_boxes [char_boxes; [prev, split_points(k)]]; end prev split_points(k); end最后模板匹配别整复杂了直接像素级对比足够应付简单场景templates load(char_templates.mat); % 预存模板库 for n 1:size(char_boxes,1) char imresize(binary(:,char_boxes(n,1):char_boxes(n,2)), [32 16]); scores zeros(1, length(templates)); for m 1:length(templates) scores(m) corr2(char, templates{m}); % 二维相关系数 end [~,idx] max(scores); result(n) template_chars(idx); % 记录匹配字符 end跑完这套流程车牌号基本能出来。但要注意这方法在强光或污损情况下可能翻车建议加个形态学滤波的备选方案。模板库最好包含各省缩写和新能源车牌的特殊字符不然遇到豫B或者粤Z这种容易扑街。Matlab基于阈值分割的车牌定位识别。 车牌识别主要包括以下三个主要步骤车牌区域定位、车牌字符分割、车牌字符识别。 通过对采集的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程来进行车牌图像预处理并由此得到一种基于车牌颜色纹理特征的车牌定位方法最终实现了车牌区域定位。 车牌字符分割是为了方便后续对车牌字符进行匹配从而对车牌进行识别。 采用了模板匹配的方法对输出的字符图像和模板库里的模板进行匹配以得到对应于车牌字符的具体信息。 代码可正常运行完整代码里记得处理彩色车牌的蓝底白字特征用HSV空间阈值能提升定位准确率。最后吐槽一句实际项目千万别用这种传统方法卷积神经网络现在才是王道但自己动手实现一遍对理解底层原理确实有帮助。