Matlabwilliam hill官网
直播中

乂统天下

5年用户 232经验值
擅长:可编程逻辑 测量仪表 嵌入式技术 控制/MCU
私信 关注

源码交流=图像处理 车牌号码识别[Tested]

`` 本帖最后由 乂统天下 于 2020-4-17 13:05 编辑

新手学习,多多关照,互相交流,共同进步^-^
【实现功能】图像处理 车牌号码识别识别[Tested]
车牌提取是通过图像处理的方法
号码提取是通过计算相似度的方法
【处理效果】
NO.1:原始图像

NO.2:车牌图像
Result2=车牌图像.jpg
NO.3:灰度图像
Result3=灰度图像.jpg
NO.4:倾斜校正
Result4=倾斜校正.jpg
NO.5:图像二值化
Result5=二值化图像.jpg
NO.6:擦除小块(开运算:先腐蚀再膨胀)
Result6=擦除.jpg
NO.7:取反
Result7=取反.jpg
NO.8:Y方向处理
Result8=Y方向处理.jpg
NO.9:二次擦除

NO.10:图像分割(号码提取)
Result10=图像分割.jpg
NO.11: 识别结果 = 桂AD5139

【改进分析】识别率并非100%,有待改进:
1.车牌中的汉字识别并不完善,有些汉字无法识别;
2.对于质量不佳的图像识别效果不理想;
3.字符识别算法有待改进

【程序展示】
因为代码较多,这里仅展示主程序代码,代码所调用的子函数暂未展示,如有需要请自行下载。
  1. clc,clear,close all

  2. % ==============测定算法执行的时间,开始计时=================
  3. tic
  4. %=====================读入图片===============================
  5. [fn,pn,fi]=uigetfile('*.jpg','选择图片');
  6. %函数的调用方法:function [FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName)
  7. % FileName:返回的文件名
  8. % PathName:返回的文件的路径名
  9. % FilterIndex:选择的文件类型
  10. % FilterSpec:文件类型设置
  11. % DialogTitle:打开对话框的标题
  12. % DefaultName:默认指向的文件名
  13. I=imread([pn fn]);figure,imshow(I);title('原始图像'); % 显示原始图像
  14. chepailujing=[pn fn];  % 这个就是包括了车牌图像的所有路径,包括文件名
  15. I_bai=I; % 图像复制一次
  16. [PY2,PY1,PX2,PX1]=caitu_fenge(I); % 确定车牌的的边界值
  17. % figure,imshow(I);
  18. % I=rgb2hsv(I);
  19. % [PY2,PY1,PX2,PX1]=caitu_tiqu(I,I_bai); % 用HSI模型识别蓝色,用rgb模型识别白色
  20. %================分割车牌区域=================================

  21. %===============车牌区域根据面积二次修正============
  22. [PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1);
  23. %==============更新图片=============================
  24. Plate=I_bai(PY1:PY2,PX1:PX2,:);%使用caitu_tiqu
  25. %==============考虑用腐蚀解决蓝色车问题=============
  26. bw=Plate;figure,imshow(bw);title('车牌图像');%hsv彩图提取图像
  27. %==============这里要根据图像的倾斜度进行选择这里选择的图片20090425686.jpg
  28. bw=rgb2gray(bw);figure,imshow(bw);title('灰度图像');
  29. %================倾斜校正===========================
  30. qingxiejiao=rando_bianhuan(bw);%计算倾斜角
  31. bw=imrotate(bw,qingxiejiao,'bilinear','crop');%imrotate图像旋转函数,选择倾斜角度数
  32. % imrotate 参数含义:'bilinear’双线性的'bicubic’双三次的
  33. % 'crop’输出的图像B和输入的图像A保持一致的尺寸,裁剪旋转的图像至合适的大小
  34. figure,imshow(bw);title('倾斜校正');% 取值为负值向右旋转
  35. %==============================================
  36. bw=im2bw(bw,graythresh(bw));
  37. % figure,imshow(bw);将图像转换成二值图像,graythresh 能用来自动计算变量 level
  38. % 将灰度图像 I 转换为二进制图像。
  39. % 输出图像 BW 将输入图像中亮度值大于 level 的像素替换为值1 (白色),其他替换为值0(黑色)。
  40. % 你指定 level 在 [0,1]之间,不用管输入图像的等级。
  41. % 函数graythresh 能用来自动计算变量 level 。如果你不指定 level ,im2bw 使用 0.5。

  42. %bwmorph作用是对二值图像进行形态学的操作
  43. figure,imshow(bw);

  44. bw=bwmorph(bw,'hbreak',inf); % figure,imshow(bw);
  45. % figure,imshow(bw);
  46. %inf表示这种情况下该操作被重复执行直到图像不再发生变化为止。
  47. %hbreak 移除H连通的像素
  48. % 1 1 1                          1 1 1
  49. % 0 1 0            变成          0 0 0
  50. % 1 1 1                          1 1 1
  51. bw=bwmorph(bw,'spur',inf); % figure,imshow(bw);title('擦除之前');
  52. % figure,imshow(bw);
  53. % 移除刺激(孤立)像素。比如:
  54. % 0? 0? 0? 0 ? ? ? ? ? ? ? ? ? 0? 0? 0? 0
  55. % 0? 0? 0? 0 ? ? ? ? ? ? ? ? ? 0? 0? 0? 0
  56. % 0? 0? 1? 0 ? ? ? 变成 ? ? ? ? ?0? 0? 0? 0
  57. % 0? 1? 0? 0 ? ? ? ? ? ? ? ? ? 0? 1? 0? 0
  58. % 1? 1? 0? 0 ? ? ? ? ? ? ? ? ? 1? 1? 0? 0

  59. bw=bwmorph(bw,'open',5);%figure,imshow(bw);title('闭合运算');
  60. % figure,imshow(bw);
  61. %open 执行形态学开操作(先腐蚀后膨胀)
  62. bw = bwareaopen(bw, threshold);%threshold 来自SEC_xiuzheng
  63. %1 matlab函数bwareaopen──删除小面积对象
  64. % 格式:BW2 = bwareaopen(BW,P,conn)
  65. % 作用:删除二值图像BW中面积小于P的对象
  66. figure,imshow(bw);title('擦除');
  67. %==================加入进度条==================
  68. % h=waitbar(0,'程序运行中,请稍等......')
  69. % for i=1:10008
  70. %     waitbar(i/5000,h)
  71. % end
  72. % close(h);
  73. %wavplay(wavread('程序运行中.wav'),22000);
  74. %===============================================
  75. bw=~bw;figure,imshow(bw);title('擦除反色'); % 颜色反转
  76. %=====对图像进一步裁剪,保证边框贴近字体========
  77. bw=touying(bw);figure;imshow(bw);title('Y方向处理');
  78. bw=~bw;
  79. bw = bwareaopen(bw, threshold);
  80. bw=~bw;
  81. figure,imshow(bw);title('二次擦除');
  82. [y,x]=size(bw);%对长宽重新赋值
  83. %================文字分割=======================
  84. fenge=shuzifenge(bw,qingxiejiao);
  85. [m,k]=size(fenge);
  86. %==========显示分割图像结果=====================
  87. figure;
  88. for s=1:2:k-1
  89.     subplot(1,k/2,(s+1)/2);imshow(bw( 1:y,fenge(s):fenge(s+1)));
  90. end
  91. title('分割后的图像');
  92. %================ 给七张图片定位================桂AV6388
  93. han_zi  =bw( 1:y,fenge(1):fenge(2));
  94. zi_mu   =bw( 1:y,fenge(3):fenge(4));
  95. zm_sz_1 =bw( 1:y,fenge(5):fenge(6));
  96. zm_sz_2 =bw( 1:y,fenge(7):fenge(8));  
  97. shuzi_1 =bw( 1:y,fenge(9):fenge(10));
  98. shuzi_2 =bw( 1:y,fenge(11):fenge(12));
  99. shuzi_3 =bw( 1:y,fenge(13):fenge(14));
  100. %================================识别====================================
  101. %======================把修正数据读入==============================
  102. xiuzhenghanzi =   imresize(han_zi, [110 55],'bilinear');
  103. xiuzhengzimu  =   imresize(zi_mu,  [110 55],'bilinear');
  104. xiuzhengzm_sz_1=  imresize(zm_sz_1,[110 55],'bilinear');
  105. xiuzhengzm_sz_2 = imresize(zm_sz_2,[110 55],'bilinear');
  106. xiuzhengshuzi_1 = imresize(shuzi_1,[110 55],'bilinear');
  107. xiuzhengshuzi_2 = imresize(shuzi_2,[110 55],'bilinear');
  108. xiuzhengshuzi_3 = imresize(shuzi_3,[110 55],'bilinear');
  109. %============ 把0-9 , A-Z以及省份简称的数据存储方便访问============
  110. hanzishengfen = duquhanzi(imread('cpgui.bmp'),imread('cpguizhou.bmp'),imread('cpjing.bmp'),imread('cpsu.bmp'),imread('cpyue.bmp'));
  111. %因数字和字母比例不同。这里要修改
  112. shuzizimu=duquszzm(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
  113.                    imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'),...
  114.                    imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
  115.                    imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
  116.                    imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
  117.                    imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
  118.                    imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
  119. zimu  = duquzimu(imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
  120.                  imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
  121.                  imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
  122.                  imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
  123.                  imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
  124. shuzi = duqushuzi(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
  125.                  imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'));
  126. %============================识别结果================================================  
  127. i=1;%shibiezm_sz该函数识别数字有问题
  128. jieguohanzi  = shibiehanzi(hanzishengfen,xiuzhenghanzi);shibiejieguo(1,i) =jieguohanzi;  i=i+1;
  129. jieguozimu   = shibiezimu(zimu,xiuzhengzimu);           shibiejieguo(1,i) =jieguozimu;   i=i+1;
  130. jieguozm_sz_1= shibiezm_sz(shuzizimu,xiuzhengzm_sz_1);  shibiejieguo(1,i) =jieguozm_sz_1;i=i+1;
  131. jieguozm_sz_2= shibiezm_sz(shuzizimu,xiuzhengzm_sz_2);  shibiejieguo(1,i) =jieguozm_sz_2;i=i+1;
  132. jieguoshuzi_1= shibieshuzi(shuzi,xiuzhengshuzi_1);      shibiejieguo(1,i) =jieguoshuzi_1;i=i+1;
  133. jieguoshuzi_2= shibieshuzi(shuzi,xiuzhengshuzi_2);      shibiejieguo(1,i) =jieguoshuzi_2;i=i+1;
  134. jieguoshuzi_3= shibieshuzi(shuzi,xiuzhengshuzi_3);      shibiejieguo(1,i) =jieguoshuzi_3;i=i+1;
  135. %==========================对话框显示显示=============================================
  136. shibiejieguo;
  137. msgbox(shibiejieguo,'识别结果');
  138. %================导出文本==========================
  139. fid=fopen('Data.xls','a+');
  140. fprintf(fid,'%s
  141. ',shibiejieguo,datestr(now));
  142. fclose(fid);
  143. %================读出声音==========================
  144. duchushengyin(shibiejieguo);
  145. %================读取计时==========================
  146. t=toc;
  147. %==================================================


【源码下载】
下载地址:https://www.lanzous.com/iajjk2f
下载密码:dinn                                             
  

代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,欢迎评论交流,您的支持是我坚持写作分享的最大动力,谢谢!


``
LY_MATLAB 图像处理车牌识别[含报告].zip (24.16 MB)
(下载次数: 152, 2020-4-7 19:16 上传)
Result9=二次擦除.jpg Result1=原始图像.jpg

更多回帖

发帖
×
20
完善资料,
赚取积分