您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 基于Matlab的车牌识别实现源码
function[]=main(jpg)closeallclctic%测定算法执行的时间[fn,pn]=uigetfile('timg1,jpg','选择图片')%读入图片I=imread([pn,fn]);figure,imshow(I);title('原始图像');%显示原始图像Im1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(Im1);title('灰度图');figure(2),subplot(1,2,2),imhist(Im1);title('灰度图的直方图');%显示图像的直方图Tiao=imadjust(Im1,[0.19,0.78],[0,1]);%调整图片figure(3),subplot(1,2,1),imshow(Tiao);title('增强灰度图');figure(3),subplot(1,2,2),imhist(Tiao);title('增强灰度图的直方图');Im2=edge(Tiao,'Roberts','both');%使用sobel算子进行边缘检测figure(4),imshow(Im2);title('sobel算子实现边缘检测')se=[1;1;1];Im3=imerode(Im2,se);figure(5),imshow(Im3);title('腐蚀效果图');se=strel('square',40);%'rectangle',[25,25]/'diamond',25/Im4=imclose(Im3,se);figure(6),imshow(Im4);title('平滑图像的轮廓');Im5=bwareaopen(Im4,1500);figure(7),imshow(Im5);title('移除小对象');[y,x,z]=size(Im5);%返回Im5各维的尺寸,并存储在变量y、x、z中Im6=double(Im5);%将Im5换成双精度数值%开始横向扫描tic%tic计时开始,toc结束,计算tic与toc之间程序的运行时间Blue_y=zeros(y,1);%产生y*1的全0矩阵fori=1:y%逐行扫描forj=1:xif(Im6(i,j,1)==1)%如果Im6图像中坐标为(i,j)的点值为1,即为移除小对象的白色区域,Blue_y(i,1)=Blue_y(i,1)+1;%则y*1列矩阵的相应像素点的元素值加1,endendend[tempMaxY]=max(Blue_y);%temp为向量Blue_y的矩阵中的最大值,MaxY为该值的索引(最大值在向量中的位置)%返回包含最大元素的列,即白色区域最宽的列%Y方向车牌区域确定figure(8),subplot(1,2,1),plot(0:y-1,Blue_y),title('行方向白色像素点累计'),xlabel('行数'),ylabel('个数');PY1=MaxY;while((Blue_y(PY1,1)=120)&&(PY11))PY1=PY1-1;endPY2=MaxY;while((Blue_y(PY2,1)=40)&&(PY2y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);%IY为原始图像I中截取的纵坐标在PY1:PY2之间的部分%横向扫描完成,开始纵向扫描Blue_x=zeros(1,x);%进一步确定x方向的车牌区域forj=1:x%逐列扫描fori=PY1:PY2if(Im6(i,j,1)==1)Blue_x(1,j)=Blue_x(1,j)+1;%根据Im5的x值确定endendendfigure(8),subplot(1,2,2),plot(0:x-1,Blue_x),title('列方向白色像素点累计'),xlabel('列数'),ylabel('个数');PX1=1;while((Blue_x(1,PX1)3)&&(PX1x))PX1=PX1+1;endPX2=x;while((Blue_x(1,PX2)3)&&(PX2PX1))PX2=PX2-1;end%end纵向扫描PX1=PX1-2;%对车牌区域的校正PX2=PX2+2;dw=I(PY1:PY2,PX1:PX2,:);t=toc;figure(9),subplot(1,2,1),imshow(IY),title('垂直方向合理区域');figure(9),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')imwrite(dw,'dw.jpg');%将图像写入图形文件中a=imread('dw.jpg');b=rgb2gray(a);imwrite(b,'车牌灰度图像.jpg');figure(10);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')g_max=double(max(max(b)));g_min=double(min(min(b)));T=round(g_max-(g_max-g_min)/3);%T为设定的二值化的阈值,返回一个四舍五入的整数值[m,n]=size(b);d=(double(b)=T);%d为二值图像imwrite(d,'车牌二值图像.jpg');figure(10);subplot(3,2,2),imshow(d),title('2.车牌二值图像')figure(10),subplot(3,2,3),imshow(d),title('3.均值滤波前')h=fspecial('average',3);%建立预定义的滤波算子,average为均值滤波,模板尺寸为3*3d=imbinarize(round(filter2(h,d)));%im2bw,使用指定的滤波器h对h进行d即均值滤波imwrite(d,'均值滤波后.jpg');figure(10),subplot(3,2,4),imshow(d),title('4.均值滤波后')se=eye(2);%单位矩阵[m,n]=size(d);%d为二值图像,返回信息矩阵ifbwarea(d)/m/n=0.365%二值图像中对象的总面积与整个面积的比大于0.365d=imerode(d,se);%进行腐蚀elseifbwarea(d)/m/n=0.235%二值图像中对象的总面积与整个面积的比值小于0.235d=imdilate(d,se);%进行膨胀endimwrite(d,'膨胀或腐蚀处理后.jpg');figure(10),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后.jpg')d=qiege(d);%切割,寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割[m,n]=size(d);k1=1;k2=1;s=sum(d);j=1;whilej~=nwhiles(j)==0j=j+1;endk1=j;whiles(j)~=0&&j=n-1j=j+1;endk2=j-1;ifk2-k1=round(n/6.5)[val,num]=min(sum(d(:,[k1+5:k2-5])));d(:,k1+num+5)=0;endendd=qiege(d);y1=10;y2=0.25;flag=0;word1=[];whileflag==0[m,n]=size(d);wide=0;whilesum(d(:,wide+1))~=0%扫过的地方不全为黑色,向右移动,直到不是停止wide=wide+1;endifwidey1%如果wide小于y1时,从数值判断没有切好,认为是左干扰d(:,[1:wide])=0;%将此片区域全部转化为黑色,d=qiege(d);%重新切割elsetemp=qiege(imcrop(d,[11widem]));%返回已经切割好的区域[m,n]=size(temp);all=sum(sum(temp));%统计切割区域所有元素two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));%统计切割区域1/3至2/3行所有元素iftwo_thirds/ally2flag=1;word1=temp;endd(:,[1:wide])=0;d=qiege(d);endend[word2,d]=getword(d);%分割出第二个字符[word3,d]=getword(d);%分割出第三个字符[word4,d]=getword(d);%分割出第四个字符[word5,d]=getword(d);%分割出第五个字符[word6,d]=getword(d);%分割出第六个字符[word7,d]=getword(d);%分割出第七个字符word1=imresize(word1,[4020]);%模板字符大小统一为40*20,为字符辨认做准备word2=imresize(word2,[4020]);word3=imresize(word3,[4020]);word4=imresize(word4,[4020]);word5=imresize(word5,[4020]);word6=imresize(word6,[4020]);word7=imresize(word7,[4020]);figure(11);subplot(2,7,1),imshow(word1),title('1');subplot(2,7,2),imshow(word2),title('2');subplot(2,7,3),imshow(word3),title('3');subplot(2,7,4),imshow(word4),title('4');subplot(2,7,5),imshow(word5),title('5');subplot(2,7,6),imshow(word6),title('6');subplot(2,7,7),imshow(word7),title('7');imwrite(word1,'1.jpg');imwrite(word2,'2.jpg');imwrite(word3,'3.jpg');imwrite(word4,'4.jpg');imwrite(word5,'5.jpg');imwrite(word6,'6.jpg');imwrite(word7,'7.jpg');liccode=char(['0':'9''A':'Z''辽粤豫鄂鲁陕京津苏浙']);%建立自动识别字符代码表,将t'0':'9''A':'Z''鲁陕苏豫'多个字符串组成一个字符数组,每行对应一个字符串,字符数不足的自动补空格SubBw2=zeros(40,20);%40*20的零矩阵l=1;forI=1:7ii=int2str(I);%整型转换字符串t=imread([ii,'.jpg']);SegBw2=imresize(t,[4020],'nearest');%改变图片的大小SegBw2=double(SegBw2)50;%将灰度图转化为二值图像,double产生0-255的灰度值ifl==1%第一位汉字识别kmin=37;kmax=46;%模板中汉字所在的位置elseifl==2%第二位字母识别kmin=11;kmax=36;%A-Z字母位置elsel=3%第三位后字母或数字识别kmin=1;kmax=36;endfork2=kmin:kmaxfname=strcat('字符模板\',liccode(k2),'.jpg');SamBw2=imread(fname);SamBw2=double(SamBw2)50;%将模板转换为二值图,double产生0-255的灰度值fori=1:40forj=1:20SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend%相当于两幅图相减得第三幅图Dmax=0;fork1=1:40forl1=1:20ifabs(SubBw2(k1,
本文标题:基于Matlab的车牌识别实现源码
链接地址:https://www.777doc.com/doc-5387349 .html