`` 本帖最后由 乂统天下 于 2020-4-17 13:05 编辑
新手学习,多多关照,互相交流,共同进步^-^
【实现功能】图像处理 车牌号码识别识别[Tested]
车牌提取是通过图像处理的方法
号码提取是通过计算相似度的方法
【处理效果】
NO.1:原始图像
NO.2:车牌图像
NO.3:灰度图像
NO.4:倾斜校正
NO.5:图像二值化
NO.6:擦除小块(开运算:先腐蚀再膨胀)
NO.7:取反
NO.8:Y方向处理
NO.9:二次擦除
NO.10:图像分割(号码提取)
NO.11: 识别结果 = 桂AD5139
【改进分析】识别率并非100%,有待改进:
1.车牌中的汉字识别并不完善,有些汉字无法识别;
2.对于质量不佳的图像识别效果不理想;
3.字符识别算法有待改进
【程序展示】
因为代码较多,这里仅展示主程序代码,代码所调用的子函数暂未展示,如有需要请自行下载。
- clc,clear,close all
- % ==============测定算法执行的时间,开始计时=================
- tic
- %=====================读入图片===============================
- [fn,pn,fi]=uigetfile('*.jpg','选择图片');
- %函数的调用方法:function [FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName)
- % FileName:返回的文件名
- % PathName:返回的文件的路径名
- % FilterIndex:选择的文件类型
- % FilterSpec:文件类型设置
- % DialogTitle:打开对话框的标题
- % DefaultName:默认指向的文件名
- I=imread([pn fn]);figure,imshow(I);title('原始图像'); % 显示原始图像
- chepailujing=[pn fn]; % 这个就是包括了车牌图像的所有路径,包括文件名
- I_bai=I; % 图像复制一次
- [PY2,PY1,PX2,PX1]=caitu_fenge(I); % 确定车牌的的边界值
- % figure,imshow(I);
- % I=rgb2hsv(I);
- % [PY2,PY1,PX2,PX1]=caitu_tiqu(I,I_bai); % 用HSI模型识别蓝色,用rgb模型识别白色
- %================分割车牌区域=================================
- %===============车牌区域根据面积二次修正============
- [PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1);
- %==============更新图片=============================
- Plate=I_bai(PY1:PY2,PX1:PX2,:);%使用caitu_tiqu
- %==============考虑用腐蚀解决蓝色车问题=============
- bw=Plate;figure,imshow(bw);title('车牌图像');%hsv彩图提取图像
- %==============这里要根据图像的倾斜度进行选择这里选择的图片20090425686.jpg
- bw=rgb2gray(bw);figure,imshow(bw);title('灰度图像');
- %================倾斜校正===========================
- qingxiejiao=rando_bianhuan(bw);%计算倾斜角
- bw=imrotate(bw,qingxiejiao,'bilinear','crop');%imrotate图像旋转函数,选择倾斜角度数
- % imrotate 参数含义:'bilinear’双线性的'bicubic’双三次的
- % 'crop’输出的图像B和输入的图像A保持一致的尺寸,裁剪旋转的图像至合适的大小
- figure,imshow(bw);title('倾斜校正');% 取值为负值向右旋转
- %==============================================
- bw=im2bw(bw,graythresh(bw));
- % figure,imshow(bw);将图像转换成二值图像,graythresh 能用来自动计算变量 level
- % 将灰度图像 I 转换为二进制图像。
- % 输出图像 BW 将输入图像中亮度值大于 level 的像素替换为值1 (白色),其他替换为值0(黑色)。
- % 你指定 level 在 [0,1]之间,不用管输入图像的等级。
- % 函数graythresh 能用来自动计算变量 level 。如果你不指定 level ,im2bw 使用 0.5。
- %bwmorph作用是对二值图像进行形态学的操作
- figure,imshow(bw);
- bw=bwmorph(bw,'hbreak',inf); % figure,imshow(bw);
- % figure,imshow(bw);
- %inf表示这种情况下该操作被重复执行直到图像不再发生变化为止。
- %hbreak 移除H连通的像素
- % 1 1 1 1 1 1
- % 0 1 0 变成 0 0 0
- % 1 1 1 1 1 1
- bw=bwmorph(bw,'spur',inf); % figure,imshow(bw);title('擦除之前');
- % figure,imshow(bw);
- % 移除刺激(孤立)像素。比如:
- % 0? 0? 0? 0 ? ? ? ? ? ? ? ? ? 0? 0? 0? 0
- % 0? 0? 0? 0 ? ? ? ? ? ? ? ? ? 0? 0? 0? 0
- % 0? 0? 1? 0 ? ? ? 变成 ? ? ? ? ?0? 0? 0? 0
- % 0? 1? 0? 0 ? ? ? ? ? ? ? ? ? 0? 1? 0? 0
- % 1? 1? 0? 0 ? ? ? ? ? ? ? ? ? 1? 1? 0? 0
- bw=bwmorph(bw,'open',5);%figure,imshow(bw);title('闭合运算');
- % figure,imshow(bw);
- %open 执行形态学开操作(先腐蚀后膨胀)
- bw = bwareaopen(bw, threshold);%threshold 来自SEC_xiuzheng
- %1 matlab函数bwareaopen──删除小面积对象
- % 格式:BW2 = bwareaopen(BW,P,conn)
- % 作用:删除二值图像BW中面积小于P的对象
- figure,imshow(bw);title('擦除');
- %==================加入进度条==================
- % h=waitbar(0,'程序运行中,请稍等......')
- % for i=1:10008
- % waitbar(i/5000,h)
- % end
- % close(h);
- %wavplay(wavread('程序运行中.wav'),22000);
- %===============================================
- bw=~bw;figure,imshow(bw);title('擦除反色'); % 颜色反转
- %=====对图像进一步裁剪,保证边框贴近字体========
- bw=touying(bw);figure;imshow(bw);title('Y方向处理');
- bw=~bw;
- bw = bwareaopen(bw, threshold);
- bw=~bw;
- figure,imshow(bw);title('二次擦除');
- [y,x]=size(bw);%对长宽重新赋值
- %================文字分割=======================
- fenge=shuzifenge(bw,qingxiejiao);
- [m,k]=size(fenge);
- %==========显示分割图像结果=====================
- figure;
- for s=1:2:k-1
- subplot(1,k/2,(s+1)/2);imshow(bw( 1:y,fenge(s):fenge(s+1)));
- end
- title('分割后的图像');
- %================ 给七张图片定位================桂AV6388
- han_zi =bw( 1:y,fenge(1):fenge(2));
- zi_mu =bw( 1:y,fenge(3):fenge(4));
- zm_sz_1 =bw( 1:y,fenge(5):fenge(6));
- zm_sz_2 =bw( 1:y,fenge(7):fenge(8));
- shuzi_1 =bw( 1:y,fenge(9):fenge(10));
- shuzi_2 =bw( 1:y,fenge(11):fenge(12));
- shuzi_3 =bw( 1:y,fenge(13):fenge(14));
- %================================识别====================================
- %======================把修正数据读入==============================
- xiuzhenghanzi = imresize(han_zi, [110 55],'bilinear');
- xiuzhengzimu = imresize(zi_mu, [110 55],'bilinear');
- xiuzhengzm_sz_1= imresize(zm_sz_1,[110 55],'bilinear');
- xiuzhengzm_sz_2 = imresize(zm_sz_2,[110 55],'bilinear');
- xiuzhengshuzi_1 = imresize(shuzi_1,[110 55],'bilinear');
- xiuzhengshuzi_2 = imresize(shuzi_2,[110 55],'bilinear');
- xiuzhengshuzi_3 = imresize(shuzi_3,[110 55],'bilinear');
- %============ 把0-9 , A-Z以及省份简称的数据存储方便访问============
- hanzishengfen = duquhanzi(imread('cpgui.bmp'),imread('cpguizhou.bmp'),imread('cpjing.bmp'),imread('cpsu.bmp'),imread('cpyue.bmp'));
- %因数字和字母比例不同。这里要修改
- shuzizimu=duquszzm(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
- imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'),...
- imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
- imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
- imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
- imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
- imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
- zimu = duquzimu(imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
- imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
- imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
- imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
- imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
- shuzi = duqushuzi(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
- imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'));
- %============================识别结果================================================
- i=1;%shibiezm_sz该函数识别数字有问题
- jieguohanzi = shibiehanzi(hanzishengfen,xiuzhenghanzi);shibiejieguo(1,i) =jieguohanzi; i=i+1;
- jieguozimu = shibiezimu(zimu,xiuzhengzimu); shibiejieguo(1,i) =jieguozimu; i=i+1;
- jieguozm_sz_1= shibiezm_sz(shuzizimu,xiuzhengzm_sz_1); shibiejieguo(1,i) =jieguozm_sz_1;i=i+1;
- jieguozm_sz_2= shibiezm_sz(shuzizimu,xiuzhengzm_sz_2); shibiejieguo(1,i) =jieguozm_sz_2;i=i+1;
- jieguoshuzi_1= shibieshuzi(shuzi,xiuzhengshuzi_1); shibiejieguo(1,i) =jieguoshuzi_1;i=i+1;
- jieguoshuzi_2= shibieshuzi(shuzi,xiuzhengshuzi_2); shibiejieguo(1,i) =jieguoshuzi_2;i=i+1;
- jieguoshuzi_3= shibieshuzi(shuzi,xiuzhengshuzi_3); shibiejieguo(1,i) =jieguoshuzi_3;i=i+1;
- %==========================对话框显示显示=============================================
- shibiejieguo;
- msgbox(shibiejieguo,'识别结果');
- %================导出文本==========================
- fid=fopen('Data.xls','a+');
- fprintf(fid,'%s
- ',shibiejieguo,datestr(now));
- fclose(fid);
- %================读出声音==========================
- duchushengyin(shibiejieguo);
- %================读取计时==========================
- t=toc;
- %==================================================
复制代码
【源码下载】
下载地址:https://www.lanzous.com/iajjk2f
下载密码:dinn
代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,欢迎评论交流,您的支持是我坚持写作分享的最大动力,谢谢!
``
3
|
|
|
|