当前位置:   article > 正文

数字图像处理之matlab大作业:车牌识别_数字图像处理技术大作业车牌识别

数字图像处理技术大作业车牌识别

1、基于模板的车牌识别,带GUI

GitHub - joeyos/LicensePlateRecognition: License plate recognition

2、基于模板的车牌识别,注释详细

https://github.com/hangxyz/License-Plate-Recognition-by-MATLAB

3、其他优秀作品

1)董同学:带语音播报的车牌识别 车牌识别-基于模板匹配_勇敢歪歪的博客-CSDN博客_车牌识别模板匹配

 2)

下面我们将详细解释第二个例子的代码:

1、代码文件说明

 2、车牌识别算法流程

1)图像预处理

  1. 将彩色图转灰度图;
  2. canny算子边缘检测;
  3. 用[1;1;1]三行一列的垂直线结构腐蚀边缘图像,因为腐蚀具有标记结构元素的作用,因此边缘图中包含丰富垂直线的部分被保留下来(即车牌);
  4. 利用矩形结构元素对辅食后图像进行闭运算,即先膨胀后腐蚀,闭运算有填充内部孔洞的作用,因此将上一步腐蚀后图像的车牌区域变成一个连通域;
  5. 利用bwareaopen函数删除二值图像中面积小于2000的对象

  1. %%%%%%%%%%1、图像预处理%%%%%%%%%%%
  2. YuanShiHuiDu=rgb2gray(YuanShi);%转化为灰度图像
  3. subplot(3,2,2),imshow(YuanShiHuiDu),title('灰度图像');
  4. BianYuan=edge(YuanShiHuiDu,'canny',0.5);%Canny算子边缘检测
  5. subplot(3,2,3),imshow(BianYuan),title('Canny算子边缘检测后图像');
  6. se1=[1;1;1]; %线型结构元素
  7. FuShi=imerode(BianYuan,se1); %腐蚀图像
  8. subplot(3,2,4),imshow(FuShi),title('腐蚀后边缘图像');
  9. se2=strel('rectangle',[25,25]); %矩形结构元素
  10. TianChong=imclose(FuShi,se2);%图像聚类、填充图像
  11. subplot(3,2,5),imshow(TianChong),title('填充后图像');
  12. YuanShiLvBo=bwareaopen(TianChong,2000);%从对象中移除面积小于2000的小对象
  13. subplot(3,2,6),imshow(YuanShiLvBo),title('形态滤波后图像');

2)车牌定位 

车牌粗定位之一确定行的起始位置和终止位置

车牌粗定位之二确定列的起始位置和终止位置

车牌精定位之一预处理

车牌精定位之二去除边框干扰(分别去除左侧和右侧干扰)

  1. %%%%%%%%%%2、车牌定位%%%%%%%%%%%
  2. [y,x]=size(YuanShiLvBo);%size函数将数组的行数返回到第一个输出变量,将数组的列数返回到第二个输出变量
  3. YuCuDingWei=double(YuanShiLvBo);
  4. %%%%%%%%%%2.1、车牌粗定位之一确定行的起始位置和终止位置%%%%%%%%%%%
  5. Y1=zeros(y,1);%产生y行1列全零数组
  6. for i=1:y
  7. for j=1:x
  8. if(YuCuDingWei(i,j)==1)
  9. Y1(i,1)= Y1(i,1)+1;%白色像素点统计
  10. end
  11. end
  12. end
  13. [temp,MaxY]=max(Y1);%Y方向车牌区域确定。返回行向量temp和MaxY,temp向量记录Y1的每列的最大值,MaxY向量记录Y1每列最大值的行号
  14. subplot(2,2,2),plot(0:y-1,Y1),title('原图行方向像素点值累计和'),xlabel('行值'),ylabel('像素');
  15. %% 找到上边界
  16. PY1=MaxY;
  17. while ((Y1(PY1,1)>=50)&&(PY1>1))
  18. PY1=PY1-1;
  19. end
  20. %%找到下边界
  21. PY2=MaxY;
  22. while ((Y1(PY2,1)>=50)&&(PY2<y))
  23. PY2=PY2+1;
  24. end
  25. %%提取上下边界之间的图像
  26. IY=YuanShi(PY1:PY2,:,:);
  27. %%%%%%%%%%2.2、车牌粗定位之二确定列的起始位置和终止位置%%%%%%%%%%%
  28. X1=zeros(1,x);%产生1行x列全零数组
  29. for j=1:x
  30. for i=PY1:PY2
  31. if(YuCuDingWei(i,j,1)==1)
  32. X1(1,j)= X1(1,j)+1;
  33. end
  34. end
  35. end
  36. subplot(2,2,4),plot(0:x-1,X1),title('原图列方向像素点值累计和'),xlabel('列值'),ylabel('像数');
  37. %% 确定左边界,从左往右开始选
  38. PX1=1;
  39. while ((X1(1,PX1)<3)&&(PX1<x))
  40. PX1=PX1+1;
  41. end
  42. %% 确定右边界,从右往左开始选
  43. PX3=x;
  44. while ((X1(1,PX3)<3)&&(PX3>PX1))
  45. PX3=PX3-1;
  46. end
  47. CuDingWei=YuanShi(PY1:PY2,PX1:PX3,:);
  48. subplot(2,2,3),imshow(CuDingWei),title('粗定位后的彩色车牌图像')
  49. %%%%%%%%%%2.3、车牌精定位之一预处理%%%%%%%%%%%
  50. CuDingWeiHuiDu=rgb2gray(CuDingWei); %将RGB图像转化为灰度图像
  51. c_max=double(max(max(CuDingWeiHuiDu)));
  52. c_min=double(min(min(CuDingWeiHuiDu)));
  53. T=round(c_max-(c_max-c_min)/3); %T为二值化的阈值
  54. CuDingWeiErZhi=im2bw(CuDingWeiHuiDu,T/256);
  55. figure(3);
  56. subplot(2,2,1),imshow(CuDingWeiErZhi),title('粗定位的二值车牌图像')%DingWei
  57. %%%%%%%%%%2.4、车牌精定位之二去除边框干扰%%%%%%%%%%%
  58. [r,s]=size(CuDingWeiErZhi);%size函数将数组的行数返回到第一个输出变量,将数组的列数返回到第二个输出变量
  59. YuJingDingWei=double(CuDingWeiErZhi);%;CuDingWeiErZhi
  60. X2=zeros(1,s);%产生1行s列全零数组
  61. for i=1:r
  62. for j=1:s
  63. if(YuJingDingWei(i,j)==1)
  64. X2(1,j)= X2(1,j)+1;%白色像素点统计
  65. end
  66. end
  67. end
  68. [temp,MaxX]=max(X2);
  69. subplot(2,2,2),plot(0:s-1,X2),title('粗定位车牌图像列方向像素点值累计和'),xlabel('列值'),ylabel('像素');
  70. %%%%%%%%%%2.4.1、去除左侧边框干扰%%%%%%%%%%%
  71. [g,h]=size(YuJingDingWei);
  72. ZuoKuanDu=0;YouKuanDu=0;KuanDuYuZhi=5;
  73. while sum(YuJingDingWei(:,ZuoKuanDu+1))~=0
  74. ZuoKuanDu=ZuoKuanDu+1;
  75. end
  76. if ZuoKuanDu<KuanDuYuZhi % 认为是左侧干扰
  77. YuJingDingWei(:,[1:ZuoKuanDu])=0;%给图像d中1KuanDu宽度间的点赋值为零
  78. YuJingDingWei=QieGe(YuJingDingWei); %值为零的点会被切割
  79. end
  80. subplot(2,2,3),imshow(YuJingDingWei),title('去除左侧边框的二值车牌图像')
  81. %%%%%%%%%2.4.1、去除右侧边框干扰%%%%%%%%%%%
  82. [e,f]=size(YuJingDingWei);%上一步裁剪了一次,所以需要再次获取图像大小
  83. d=f;
  84. while sum(YuJingDingWei(:,d-1))~=0
  85. YouKuanDu=YouKuanDu+1;
  86. d=d-1;
  87. end
  88. if YouKuanDu<KuanDuYuZhi % 认为是右侧干扰
  89. YuJingDingWei(:,[(f-YouKuanDu):f])=0;%
  90. YuJingDingWei=QieGe(YuJingDingWei); %值为零的点会被切割
  91. end
  92. subplot(2,2,4),imshow(YuJingDingWei),title('精确定位的车牌二值图像')
  93. % % % %%%%%%%%%%2.5、保存车牌图像%%%%%%%%%%%
  94. % % % % imwrite(DingWei,'DingWei.jpg');
  95. % % % % [filename,filepath]=uigetfile('DingWei.jpg','输入一个定位裁剪后的车牌图像');
  96. % % % % jpg=strcat(filepath,filename);
  97. % % % % DingWei=imread('DingWei.jpg');

3、车牌字符分割

预处理

字符分割

  1. %%%%%%%%%3、车牌字符分割%%%%%%%%%%%
  2. %%%%%%%%%3.1、预处理%%%%%%%%%%%
  3. figure(4);
  4. subplot(2,2,1),imshow(DingWei),title('车牌图像')
  5. ChePaiHuiDu=rgb2gray(DingWei); %将RGB图像转化为灰度图像
  6. subplot(2,2,2),imshow(ChePaiHuiDu),title('车牌灰度图像')
  7. g_max=double(max(max(ChePaiHuiDu)));
  8. g_min=double(min(min(ChePaiHuiDu)));
  9. T=round(g_max-(g_max-g_min)/3); %T为二值化的阈值
  10. [m,n]=size(ChePaiHuiDu);
  11. % ChePaiErZhi=(double(ChePaiHuiDu)>=T); %车牌二值图像
  12. ChePaiErZhi=im2bw(ChePaiHuiDu,T/256);
  13. % im2bw:通过设定亮度将真彩等图像转换为二值图像,T/256为阈值,范围[0,1]
  14. subplot(2,2,3),imshow(ChePaiErZhi),title('车牌二值图像')
  15. ChePaiErZhi=YuJingDingWei;%logical()
  16. ChePaiLvBo=bwareaopen(ChePaiErZhi,20);
  17. subplot(1,2,1),imshow(ChePaiLvBo),title('形态学滤波后的车牌二值图像')
  18. ChePaiYuFenGe=double(ChePaiLvBo);
  19. [p,q]=size(ChePaiYuFenGe);
  20. X3=zeros(1,q);%产生1行q列全零数组
  21. for j=1:q
  22. for i=1:p
  23. if(ChePaiYuFenGe(i,j)==1)
  24. X3(1,j)=X3(1,j)+1;
  25. end
  26. end
  27. end
  28. subplot(1,2,2),plot(0:q-1,X3),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量');
  29. %%%%%%%%%%3.2、字符分割%%%%%%%%%%%p高q宽,倒序分割
  30. Px0=q;%字符右侧限
  31. Px1=q;%字符左侧限
  32. for i=1:6
  33. while((X3(1,Px0)<3)&&(Px0>0))
  34. Px0=Px0-1;
  35. end
  36. Px1=Px0;
  37. while(((X3(1,Px1)>=3))&&(Px1>0)||((Px0-Px1)<15))
  38. Px1=Px1-1;
  39. end
  40. ChePaiFenGe=ChePaiLvBo(:,Px1:Px0,:);
  41. figure(6);subplot(1,7,8-i);imshow(ChePaiFenGe);
  42. ii=int2str(8-i);
  43. imwrite(ChePaiFenGe,strcat(ii,'.jpg'));%strcat连接字符串。保存字符图像。
  44. Px0=Px1;
  45. end
  46. %%%%%%%%%%对第一个字符进行特别处理%%%%%%%%%%%
  47. PX3=Px1;%字符1右侧限
  48. while((X3(1,PX3)<3)&&(PX3>0))
  49. PX3=PX3-1;
  50. end
  51. ZiFu1DingWei=ChePaiYuFenGe(:,1:PX3,:);
  52. subplot(1,7,1);imshow(ZiFu1DingWei);
  53. imwrite(ZiFu1DingWei,'1.jpg');

4、字符识别

  1. %%%%%%%%%%%4、车牌字符识别%%%%%%%%%%%
  2. %%%%%%%%%%%4.1、车牌字符预处理%%%%%%%%%%%
  3. ZiFu1=imresize(~imread('1.jpg'), [110 55],'bilinear');%用反色识别
  4. ZiFu2=imresize(~imread('2.jpg'), [110 55],'bilinear');
  5. ZiFu3=imresize(~imread('3.jpg'), [110 55],'bilinear');
  6. ZiFu4=imresize(~imread('4.jpg'), [110 55],'bilinear');
  7. ZiFu5=imresize(~imread('5.jpg'), [110 55],'bilinear');
  8. ZiFu6=imresize(~imread('6.jpg'), [110 55],'bilinear');
  9. ZiFu7=imresize(~imread('7.jpg'), [110 55],'bilinear');
  10. %%%%%%%%%%%4.2、把0-9,A-Z以及省份简称的数据存储方便访问%%%%%%%%%%%
  11. HanZi=DuQuHanZi(imread('MuBanKu\sichuan.bmp'),imread('MuBanKu\guizhou.bmp'),imread('MuBanKu\beijing.bmp'),imread('MuBanKu\chongqing.bmp'),...
  12. imread('MuBanKu\guangdong.bmp'),imread('MuBanKu\shandong.bmp'),imread('MuBanKu\zhejiang.bmp'));
  13. ShuZiZiMu=DuQuSZZM(imread('MuBanKu\0.bmp'),imread('MuBanKu\1.bmp'),imread('MuBanKu\2.bmp'),imread('MuBanKu\3.bmp'),imread('MuBanKu\4.bmp'),...
  14. imread('MuBanKu\5.bmp'),imread('MuBanKu\6.bmp'),imread('MuBanKu\7.bmp'),imread('MuBanKu\8.bmp'),imread('MuBanKu\9.bmp'),...
  15. imread('MuBanKu\10.bmp'),imread('MuBanKu\11.bmp'),imread('MuBanKu\12.bmp'),imread('MuBanKu\13.bmp'),imread('MuBanKu\14.bmp'),...
  16. imread('MuBanKu\15.bmp'),imread('MuBanKu\16.bmp'),imread('MuBanKu\17.bmp'),imread('MuBanKu\18.bmp'),imread('MuBanKu\19.bmp'),...
  17. imread('MuBanKu\20.bmp'),imread('MuBanKu\21.bmp'),imread('MuBanKu\22.bmp'),imread('MuBanKu\23.bmp'),imread('MuBanKu\24.bmp'),...
  18. imread('MuBanKu\25.bmp'),imread('MuBanKu\26.bmp'),imread('MuBanKu\27.bmp'),imread('MuBanKu\28.bmp'),imread('MuBanKu\29.bmp'),...
  19. imread('MuBanKu\30.bmp'),imread('MuBanKu\31.bmp'),imread('MuBanKu\32.bmp'),imread('MuBanKu\33.bmp'));
  20. ZiMu=DuQuZiMu(imread('MuBanKu\10.bmp'),imread('MuBanKu\11.bmp'),imread('MuBanKu\12.bmp'),imread('MuBanKu\13.bmp'),imread('MuBanKu\14.bmp'),...
  21. imread('MuBanKu\15.bmp'),imread('MuBanKu\16.bmp'),imread('MuBanKu\17.bmp'),imread('MuBanKu\18.bmp'),imread('MuBanKu\19.bmp'),...
  22. imread('MuBanKu\20.bmp'),imread('MuBanKu\21.bmp'),imread('MuBanKu\22.bmp'),imread('MuBanKu\23.bmp'),imread('MuBanKu\24.bmp'),...
  23. imread('MuBanKu\25.bmp'),imread('MuBanKu\26.bmp'),imread('MuBanKu\27.bmp'),imread('MuBanKu\28.bmp'),imread('MuBanKu\29.bmp'),...
  24. imread('MuBanKu\30.bmp'),imread('MuBanKu\31.bmp'),imread('MuBanKu\32.bmp'),imread('MuBanKu\33.bmp'));
  25. ShuZi=DuQuShuZi(imread('MuBanKu\0.bmp'),imread('MuBanKu\1.bmp'),imread('MuBanKu\2.bmp'),imread('MuBanKu\3.bmp'),imread('MuBanKu\4.bmp'),...
  26. imread('MuBanKu\5.bmp'),imread('MuBanKu\6.bmp'),imread('MuBanKu\7.bmp'),imread('MuBanKu\8.bmp'),imread('MuBanKu\9.bmp'));
  27. %%%%%%%%%%%4.3、车牌字符识别%%%%%%%%%%%
  28. t=1;
  29. ZiFu1JieGuo=ShiBieHanZi(HanZi,ZiFu1); ShiBieJieGuo(1,t)=ZiFu1JieGuo;t=t+1;
  30. ZiFu2JieGuo=ShiBieZiMu (ZiMu, ZiFu2); ShiBieJieGuo(1,t)=ZiFu2JieGuo;t=t+1;
  31. ZiFu3JieGuo=ShiBieSZZM(ShuZiZiMu,ZiFu3);ShiBieJieGuo(1,t)=ZiFu3JieGuo;t=t+1;
  32. ZiFu4JieGuo=ShiBieSZZM(ShuZiZiMu,ZiFu4);ShiBieJieGuo(1,t)=ZiFu4JieGuo;t=t+1;
  33. ZiFu5JieGuo=ShiBieShuZi(ShuZi,ZiFu5); ShiBieJieGuo(1,t)=ZiFu5JieGuo;t=t+1;
  34. ZiFu6JieGuo=ShiBieShuZi(ShuZi,ZiFu6); ShiBieJieGuo(1,t)=ZiFu6JieGuo;t=t+1;
  35. ZiFu7JieGuo=ShiBieShuZi(ShuZi,ZiFu7); ShiBieJieGuo(1,t)=ZiFu7JieGuo;t=t+1;
  36. ShiBieJieGuo
  37. msgbox(ShiBieJieGuo,'结果');
  38. fid=fopen('Data.xls','a+');
  39. fprintf(fid,'%s\r\n',ShiBieJieGuo,datestr(now));
  40. fclose(fid);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/257566
推荐阅读
相关标签
  

闽ICP备14008679号