您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > 基于matlab的汽车牌照识别源程序
基于matlab的车牌识别的源程序clcclearfilename='E:\matlab7.0\car.jpg';%图片的路径I=im2gray(filename);%调用自编函数读取图像,并转化为灰度图象;tic%计时开始[height,width]=size(I);%预处理I_edge=zeros(height,width);%创建height*width矩阵fori=1:width-1%对每一列进行遍历I_edge(:,i)=abs(I(:,i+1)-I(:,i));%每列的值赋为原图像中左右两列相减的绝对值(即梯度)end%归一化处理(0~255)I_edge=(255/(max(max(I_edge))-min(min(I_edge))))*(I_edge-min(min(I_edge)));[I_edge,y1]=select(I_edge,height,width);%%%%%%调用select函数选择图像的某个区域BW2=I_edge;%%%%%%%%%%%%%%%%%一些形态学处理SE=strel('rectangle',[10,10]);%创建10*10的建构元素IM2=imerode(BW2,SE);%腐蚀IM2=bwareaopen(IM2,20);%删除小面积IM3=imdilate(IM2,SE);%膨胀%先腐蚀再膨胀,进行了开运算,消除小物体%%%%%%%%%%%%%%%%%%投影以粗略估计车牌位置p_h=projection(double(IM3),'h');%调用projection函数,水平方向if(p_h(1)0)p_h=[0,p_h];endp_v=projection(double(IM3),'v');%调用projection函数,垂直方向if(p_v(1)0)p_v=[0,p_v];end%%%%%%p_h=double((p_h5));%水平方向p_h=find(((p_h(1:end-1)-p_h(2:end))~=0));len_h=length(p_h)/2;%%%%%p_v=double((p_v5));%垂直方向p_v=find(((p_v(1:end-1)-p_v(2:end))~=0));len_v=length(p_v)/2;%%%%%%%%%%%%%%%%%%%%%%%%%%%%粗略计算车牌候选区k=1;fori=1:len_hforj=1:len_vs=IM3(p_h(2*i-1):p_h(2*i),p_v(2*j-1):p_v(2*j));if(mean(mean(s))0.1)p{k}=[p_h(2*i-1),p_h(2*i)+1,p_v(2*j-1),p_v(2*j)+1];k=k+1;endendendk=k-1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%进一步缩小车牌候选区fori=1:kedge_IM3=double(edge(double(IM3(p{i}(1):p{i}(2),p{i}(3):p{i}(4))),'canny'));[x,y]=find(edge_IM3==1);p{i}=[p{i}(1)+min(x),p{i}(2)-(p{i}(2)-p{i}(1)+1-max(x)),...p{i}(3)+min(y),p{i}(4)-(p{i}(4)-p{i}(3)+1-max(y))];p_center{i}=[fix((p{i}(1)+p{i}(2))/2),fix((p{i}(3)+p{i}(4))/2)];p_ratio(i)=(p{i}(4)-p{i}(3))/(p{i}(2)-p{i}(1));end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%对上面参数和变量的说明:p为一胞元,用于存放每个图像块的左上和右下两个点的坐标;%存放格式为:p{k}=[x1,x2,y1,y2];x1,x2分别为行坐标,y1,y2为列坐标%p_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];x,y分别为行,列坐标%p_ratio为一矩阵,用来存放图像块的长宽比例%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%合并临近区域%%%%%%%%如果有多个区域则执行合并ifk1n=0;ncount=zeros(1,k);fori=1:k-1%%%需要调整if条件中的比例%%%需要调整%检查是否满足合并条件if(abs(p{i}(1)+p{i}(2)-p{i+1}(1)-p{i+1}(2))=height/30&&abs(p{i+1}(3)-p{i}(4))=width/15)p{i+1}(1)=min(p{i}(1),p{i+1}(1));p{i+1}(2)=max(p{i}(2),p{i+1}(2));p{i+1}(3)=min(p{i}(3),p{i+1}(3));p{i+1}(4)=max(p{i}(4),p{i+1}(4));%向后合并n=n+1;ncount(n)=i+1;endend%如果有合并,求出合并后最终区域if(n0)d_ncount=ncount(2:n+1)-ncount(1:n);%避免重复记录临近的多个区域。index=find(d_ncount~=1);m=length(index);fori=1:mpp{i}=p{ncount(index(i))};%重新记录合并区域的比例pp_ratio(i)=(pp{i}(4)-pp{i}(3))/(pp{i}(2)-pp{i}(1));endp=pp;%更新区域记录p_ratio=pp_ratio;%更新区域比例记录clearpp;clearpp_ratio;%清除部分变量endendk=length(p);%更新区域个数%%%%%%%%%%%%%%合并结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%根据区域比例判断是否为车牌区域%%%%%%%%%%%%m=1;T=0.6*max(p_ratio);fori=1:kif(p_ratio(i)=T&p_ratio(i)20)p1{m}=p{i};m=m+1;endendp=p1;clearp1;k=m-1;%更新区域数%%%%%%%%%%%判定结束%%%%%%%%%%%%%%%%%%%%%toc%计时结束clearedge_IM3;clearx;cleary;%清空部分变量%%%%%%%%%%%%%%%%显示figure(1)imshow(I);title('原始图像')figure(2)imshow(IM2);title('腐蚀后图像')figure(3)imshow(IM3);title('灰度膨胀后图像')%%%%%%%%%%%%%%%%%显示figure(4)fori=1:ksubplot(1,k,i);index=p{i};imshow(I(index(1)-2:index(2),index(3):index(4)));title('车牌图像')end%存储车牌图像if(k==1)imwrite(I(index(1)-2:index(2),index(3):index(4)),'cp.jpg');end%将指定的图象文件转化为灰度图象functionI=im2gray(filename)colortype=imfinfo(filename);%用于获取位图相关信息colortype=colortype.ColorType;%获取图象颜色类型%类型判断switch(colortype)case'truecolor'%如果是彩图I=rgb2gray(imread(filename));%把彩图转化为灰度图像case'indexed'%如果是索引图[I,map]=imread(filename);I=ind2gray(I,map);%把索引图转化为灰度图像otherwise%其他类型I=imread(filename);endclearfilename;clearcolortype;%图像格式用处和区别:%1.彩图(truecolor)表示为一个3通道矩阵,可以最自由的表现色彩,需要的空间最大,也是现在各种数码相机最常见的输出格式,比如一般jpg图像导入matlab看都是3通道矩阵。%2.灰度图表示为一个矩阵,是图像处理最常用的默认图像类型,这是因为它是一个最简单的二维数据结构,适于做数学运算。如果试验新算法的时候,一定先在灰度图像上做,做好了再考虑往彩图推广。%3.索引图(indexed)由索引矩阵和colormap两部分组成。其中索引矩阵也是一个普通的二维矩阵,只不过其中的每一个数值不代表灰度,而代表colormap中的一个index。而图像的显示效果,由colormap决定:它是彩色的,图像就是彩色的,;它是灰度的,图像就是灰度的。当然,一般还是用来表示彩色啦。这种方式比真彩图的颜色表达能力弱,不过更省空间,像早期的256色图就是这种格式。%4.二值图一般不独立出现。它更像是一种数学处理的结果,凡是对图像的像素进行了二分类,分类结果都可以用二值图表示:比如图像分割。functiony=projection(I,s)if(s=='h')%水平投影y=sum(I');endif(s=='v')%垂直投影y=sum(I);endfunction[y,y1]=select(ImageData,h,w)%取得最佳阈值将图像二值化thr=0.5;delta=0.05;y=(ImageData=thr*mean(max(ImageData)));BW2=bwareaopen(y,10);%删除小面积对象%格式:BW2=bwareaopen(BW,P,conn)%作用:删除二值图像BW中面积小于P的对象,默认情况下conn使用8邻域。SE=strel('square',15);%创建一个正方形的结构元素%SE=strel(shape,parameters)%根据shape指定的类型创建一个结构元素SE。IM2=imdilate(BW2,SE);%图像膨胀IM3=imerode(IM2,SE);%图像腐蚀%1.开运算(先腐蚀后膨胀的过程):利用它可以消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不明显改变原来物体的面积。OPEN(X,B)%2.闭运算(先膨胀后腐蚀的过程):利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但同时并不明显改变原来物体的面积。CLOSE(X,B)average=sum(sum(IM3))/(h*w);%将图像二值化while(average0.03||average0.08)if(average0.03)thr=thr-delta;elsethr=thr+delta;endy=(ImageData=thr*mean(max(ImageData)));%求向量元素的平均值BW2=bwareaopen(y,10);%再一次删除小面积IM2=imdilate(BW2,SE);%膨胀IM3=imerode(IM2,SE);%腐蚀average=sum(sum(IM3))/(h*w);%求灰度的平均值endy1=y;y=IM3;
本文标题:基于matlab的汽车牌照识别源程序
链接地址:https://www.777doc.com/doc-5180855 .html