一、简介

1 在进行图像处理任务之前,首先要明确处理对象和处理流程
处理对象: 新能源车牌和蓝色车牌
处理流程:

2 由于要对蓝色和新能源车牌进行识别,而且新能源车牌是渐变色,所以直接通过设定阈值的方法去识别两种车牌并没有单独识别蓝色车牌的可靠性高。这里,我根据车牌字符的特征进行车牌位置定位:
2.1 根据字符特征初步找出车牌位置

2.2 根据车牌长宽比进行初步筛选
我们可以用最小外接矩形算法框出上一步已选出的区域,然后根据车牌长宽比设定阈值,将满足阈值的矩形筛选出来,当然但还是会存在一部分干扰区域。

2.3 对矩形内像素进行颜色统计
通过对初步筛选后剩余区域分别进行像素的颜色统计,我们即可准确找出车牌位置,与此同时车牌的类型(新能源或蓝牌)也可以在这里判断出来

3 倾斜校正
这一步是为后面垂直投影法分割字符和模板匹配做准备

简单来讲,使用霍夫线算法检测车牌上下边框所在直线,计算这条直线倾斜角度,之后对车牌进行旋转即可。当然复杂点的方法可以具体看我的源程序,具体效果如下图:

4 二值化、形态学处理、字符识别
4.1 二值化和形态学处理这里就不在赘述,很多博客已经讲的非常清晰
4.2 字符分割
在这里需要对字符进行准确的分割,在分割之前还是可能会有干扰,需要再次分割出车牌字符的准确位置。这里我的方法是:先向左投影,设定阈值,切割出上下边界,同理在切割出左右边界。但是这只适用于车牌边框明显的情况下,所以我不建议你使用这个方法,慎用!!!

到这里就可以使用垂直投影法进行字符分割,这里需要注意的是新能源车牌有八位,蓝牌有七位
分割结果如下图所示:

4.3 字符识别
这里使用模板匹配,因为新能源车牌字符和蓝牌字符不一致,所以要制作两套字符模板。另外需要注意的是,根据《中华人民共和国机动车号牌》序号编码规则,26个英文字符中“I“、”O“不能使用,所以不存在"1"和"I"、"0"和"O"字符混淆的问题

二、源代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% resize的目标尺寸650*X
% 调参
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;se1 = strel('rectangle',[15 15]);                                 %创建一个平坦的矩形结构
se2 = strel('rectangle',[12 20]);                                 %创建一个平坦的矩形结构
se3 = strel('rectangle',[12 15]);
imgraw=imread('C:\Users\lenovo\Desktop\licenseplate\0.png');                %读取图% se1 = strel('rectangle',[15 25]);                                 %创建一个平坦的矩形结构
% se2 = strel('rectangle',[10 25]);                                 %创建一个平坦的矩形结构
% se3 = strel('rectangle',[14 19]);
% imgraw=imread('E:\matlab workspace\licenseplate\车牌2.jpg');                %读取图像[m,~]=size(imgraw);
times = 650/m;
img=imresize(imgraw,times,'nearest');
g= fspecial('gaussian',[5,5],1);                                  %高斯滤波器
g_img = imfilter(img, g, 'replicate');                            %图像滤波
gray_img=rgb2gray(g_img);                                         %转为灰色图像
open = imopen(gray_img,se1);                                      %图像开操作
sub_img = imsubtract(gray_img,open);                              %图像相减
BW_img = imbinarize(sub_img);                                     %使用Otsu方法确定全局阈值进行二值化
edge_img = edge(BW_img,'canny');
edge_img1 = imclose(edge_img,se2);                                %图像闭操作
edge_img2 = imopen(edge_img1,se3);                                %图像开操作%%%%%%%%%%%%%%%%%%%%%%%%%%%使用车牌长宽比进行判断%%%%%%%%%%%%%%%%%%%%%%%%%%%[B,L] = bwboundaries(edge_img2,'noholes');
num_rect = 0;                                                               %符合要求的矩形数量
matrix_rect = {};                                                           %符合要求的矩形的坐标元胞矩阵
for k = 1:length(B)boundary = B{k};c = boundary(:,2);r = boundary(:,1);[rectx,recty,area,perimeter] = minboundrect(c,r,'a');                    %rectx,recty为逆时针排列width = round(sqrt((recty(1)-recty(2))^2+(rectx(1)-rectx(2))^2));leth = round(sqrt((recty(2)-recty(3))^2+(rectx(2)-rectx(3))^2));if width > lethtemp = width;width = leth;leth = temp;endratio = leth / width;if ratio >2.5 && ratio <4.5num_rect = num_rect + 1;matrix_rect{num_rect} = [rectx,recty];end
end    subplot(451); imshow(img); title('原始图像');
subplot(452); imshow(g_img);    title('高通滤波后图像');
subplot(453); imshow(gray_img);    title('灰度图像');
subplot(454); imshow(open);    title('图像开操作');
subplot(455); imshow(sub_img);    title('图像相减');
subplot(456); imshow(BW_img);    title('图像二值化');
subplot(457); imshow(edge_img);    title('图像边缘');
subplot(458); imshow(edge_img2);    title('图像开闭操作');
subplot(459); imshow(img);    title('原图框出车牌');
hold on
for k = 1:num_rectrect = matrix_rect{k};rx = rect(:,1);ry = rect(:,2);line(rx,ry,'Color','red');
end%%%%%%%%%%%%%%%%%%%%%%%%%%%判断颜色、二次判断车牌%%%%%%%%%%%%%%%%%%%%%%%%%%%p=0;  %计算满足颜色条件的次数
color = 'no';
for o=1:num_rectz=matrix_rect{o};mid1x=(z(1,1)+z(2,1))/2;mid1y=(z(1,2)+z(2,2))/2;mid2x=(z(3,1)+z(4,1))/2;mid2y=(z(3,2)+z(4,2))/2;green=0;blue=0;hsv= rgb2hsv(img);  %RGB转换为HSVimg_count = (abs(ceil(mid2x+0.601)-floor(mid1x+0.601)))*(abs(ceil(mid2y+0.001)-floor(mid1y+0.001)));subplot(4,5,10);  imshow(hsv);for i=ceil(mid1y+1):floor(mid2y-1)if mid2x==mid1xfor j=floor(mid2x+1):ceil(mid1x+1)h = hsv(i,j,1);s = hsv(i,j,2);v = hsv(i,j,3);if 0.40< h && h <= 0.46 &&  s>0.4 && s<=1 && v>0.3 && v<1green = green+1;elseif 0.56<h && h<=0.72 && s>0.4 && s<=1 && v>0.4 && v<1blue =blue +1;                endend       elsefor j=ceil(mid2x+1):floor(mid1x-1)h = hsv(i,j,1);s = hsv(i,j,2);v = hsv(i,j,3);if 0.40< h && h <= 0.46 &&  s>0.4 && s<=1 && v>0.3 && v<1green = green+1;elseif 0.56<h && h<=0.72 && s>0.4 && s<=1 && v>0.4 && v<1blue =blue +1;                endendendendif green*2 >= img_count && green>bluecolor = 'green';p=p+1;b=z;   %满足条件的元胞elseif blue*2 >= img_count && blue>greencolor = 'blue';p=p+1;b=z;   %满足条件的元胞end
endif (color == 'blue')&&(p == 1)flag = 0;style = '识别到的是蓝色';
elseif (color == 'green')&&(p == 1)flag = 1;style = '识别到的是新能源';
end
function image=cutting(img,flag) %获取图片大小[row,col] = size(img); %设定边界img(:,col)=1;img(:,1)=1; %图像取反,方便后续处理,根据黑色判断边界all = sum(~img);  %行向量%figure('NumberTitle','off','Name','投影'),bar(a),title('投影');left = 1;right = 1;count1 =0; %记录字符个数for i = 1:col-1  %从左到右扫描if all(i)==0&&all(i+1)~=0 %左侧边界left = i;endif all(i)~=0&&all(i+1)==0 %右侧边界right=i;elseright =0; %左右两侧均为黑色边框endif right~=0count1 = count1+1;left_bound(count1) = left; %存放左边界right_bound(count1) = right; %存放右边界end    endfor i = 1:count1 %???if left_bound(i)<fix(col/8)left_bound(i)=left_bound(1);endendcount2 =1; %k记录满足条件的字符个数right_boundary = zeros(1,count1); %存放右边界left_boundary = zeros(1,count1); %存放左边界for i = 1:count1if (right_bound(i) - left_bound(i))>(fix(col/15)) %判断字符宽度是否满足要求 问题:字符宽度怎么求right_boundary(count2) = right_bound(i);left_boundary(count2) = left_bound(i);count2 = count2+1;endend

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]呙润华,苏婷婷,马晓伟.BP神经网络联合模板匹配的车牌识别系统[J].清华大学学报(自然科学版),2013,53(9):1221-1226.
[6]鲁扬.基于BP神经网络的车牌识别算法研究[D].大庆:东北石油大学,2018.
[7]李强,张娟.一种改进的基于模板匹配的污损车牌识别方法[J].智能计算机与应用. 2019,9(03).
[8] 梁凯.基于MATLAB的汽车车牌识别系统的设计与实现[D] .哈尔滨:黑龙江大学, 2018.
[9]刘雄飞,朱盛春.车牌字符多特征提取与BP神经网络的识别算法[J].计算机仿真,2014,31(10):161-164,290.
[10]乔有田.基于数学形态学和灰度跳变特征的车牌定位方法[J].工业控制计算,2015(2):77-78

【车牌识别】基于matlab GUI模板匹配新能源车牌识别【含Matlab源码 865期】相关推荐

  1. 【图像处理】基于matlab GUI多功能图像处理系统【含Matlab源码 1876期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像处理]基于matlab GUI多功能图像处理系统[含Matlab源码 1876期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  2. 【机械仿真】基于matlab GUI曲柄摇杆机构运动仿真【含Matlab源码 1608期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI曲柄摇杆机构运动仿真[含Matlab源码 1608期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  3. 【光学】基于matlab GUI光栅条纹投影生成【含Matlab源码 2118期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI光栅条纹投影生成[含Matlab源码 2118期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  4. 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI直齿圆柱齿轮应力计算[含Matlab源码 2077期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  5. 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】

    一.⛄获取代码方式 获取代码方式1: 完整代码已上传我的资源:[天体学]基于matlab GUI太阳天顶角计算[含Matlab源码 2229期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  6. 【字符识别】基于matlab GUI模板匹配(区域生长法)字母+数字识别【含Matlab源码 1695期】

    一.手写大写字母识别技术简介 0 引言 在高校教学过程中,考试是最为普遍的一种教学评估.综合练习的教学手段,随着科技进步,考试阅卷的方式也发生了巨大的变革.传统的阅卷方式主要以人工阅卷为主, 存在效率 ...

  7. 【车牌识别】模板匹配新能源车牌识别【含Matlab源码 865期】

    ⛄一.简介 1 在进行图像处理任务之前,首先要明确处理对象和处理流程 处理对象: 新能源车牌和蓝色车牌 处理流程: 2 由于要对蓝色和新能源车牌进行识别,而且新能源车牌是渐变色,所以直接通过设定阈值的 ...

  8. 【语音去噪】基于matlab GUI IIR滤波器语音去噪【含Matlab源码 1864期】

    一.语音处理简介 语言是人们获得各类有效信息的主要途径, 而语音是语言的表现形式.语音在一定程度上可影响人们的生活, 因此, 语音信号的研究对科学领域和人们日常生活具有一定的研究价值和意义.噪声广泛存 ...

  9. 【数学建模】基于matlab GUI平行停车模拟仿真【含Matlab源码 1877期】

    一.平行停车模拟仿真简介 近年来, 随着我国经济的快速发展, 机动车保有量也迅速增长.截至2012年底, 全国机动车保有量已达2.4亿辆, 城市"停车难"的问题日趋严重.统计结果表 ...

  10. 【图像识别】基于形态学和模板匹配实现扑克牌识别matlab源码

    一.简介 1 灰度化 (grayscale) 将彩色图像转化为灰度图像的过程称为图像灰度化.彩色图像中的像素值由RGB三个分量决定,每个分量都有0-255(256种)选择,这样一个像素点的像素值可以有 ...

最新文章

  1. 基于Bootstrap、Jquery的自适应导航栏
  2. intelij maven
  3. 41. 包含min函数的栈【单调栈】
  4. JS的NaN与isNaN
  5. 手机相机自动识别语音提示
  6. python快递分拣小程序_利用Python开发的ATM小程序
  7. java shiro实例_spring+shiro 整合实例代码详解
  8. 电子科大计算机2014级,电子科大-计算机-操作系统实验报告-2014级.docx
  9. Javascript第五章history对象第四课
  10. 苹果核 - iOS端Mock GPS定位 —— 测试、开发、玩游戏、发朋友圈等等,你都用得上...
  11. 如何快速学python
  12. Android:ViewPage使用教程
  13. python大数据方向_大数据行业5个职位方向指南
  14. 自然语言处理Pytorch实现CharRNN歌词生成
  15. Python学习week3
  16. 【POI2013】bzoj3426 Tower Defence Game
  17. liferay 7.0开发到部署
  18. codeforces-D. Colored Boots
  19. STM32入门指南(1)—新建第一个工程
  20. 系统结构-并行算法FORK JOIN

热门文章

  1. Eclipse配置中文(汉化)
  2. 路由器交换机[置顶] 路由器和交换机的综合实验⑵
  3. 高反差保留滤镜学习OpenCV:滤镜系列(11)——高反差保留
  4. 树莓派使用 USB 摄像头做网络监控
  5. OpenCV人工智能图像处理学习笔记1目录
  6. 实验假设与分析方法(参数与非参检验)
  7. Atitit 编程 序列化技术点 概念原理v2 1. 序列化: 1 2. 序列化的目的 1 2.1. 为了传输 或者存储 1 3. 应用场合 1 3.1. Form提交url 1 3.2. For
  8. Atitit.log日志技术的最佳实践attilax总结
  9. Atitit. .net c# web 跟客户端winform 的ui控件结构比较
  10. paip.动画透明淡入淡出窗口之重绘性能