I=imread('18.jpg');I=imresize(I,[515,407]);figure(1),imshow(I);Scolor=I;Scolor = imread('3.jpg');%imread函数读取图像文件%将彩色图像转换为黑白并显示Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图像figure,imshow(Sgray),title('原始黑白图像');%Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strei函数Bgray=imopen(Sgray,s);%打开sgray s图像figure,imshow(Bgray);title('背景图像');%输出背景图像%用原始图像与背景图像作减法,增强图像Egray=imsubtract(Sgray,Bgray);%两幅图相减figure,imshow(Egray);title('增强黑白图像');%输出黑白图像bw2=im2bw(Egray,graythresh(Egray));figure,imshow(bw2);title('图像二值化');%得到二值图像SE=strel('disk',2);bw3=imerode(bw2,SE);grd=imsubtract(bw2,bw3);figure,imshow(grd);bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像bg2=imopen(bg3,strel('rectangle',[19,1]));%取矩形框的开运算figure,imshow(bg2);title('图像开运算[19,1]');%输出开运算的图像%Step5 对二值图像进行区域提取,并计算区域特征参数。
进行区域特征参数比较,提取车牌区域[L,num] = bwlabel(bg2,8);%标注二进制图像中已连接的部分Feastats = imfeature(L,'basic');%计算图像区域的特征尺寸Area=[Feastats.Area];%区域面积BoundingBox=[Feastats.BoundingBox];%[x y width height]车牌的框架大小RGB = label2rgb(L, 'spring', 'k', 'shuffle'); %标志图像向RGB 图像转换figure,imshow(RGB);title('图像彩色标记');%输出框架的彩色图像lx=0;for L=1:numwidth=BoundingBox((L-1)*4+3);%框架宽度的计算hight=BoundingBox((L-1)*4+4);%框架高度的计算if (width>98 & width<160 & hight>25 & hight<50)%框架的宽度和高度的范围lx=lx+1;Getok(lx)=l;endendfor k= 1:lxL=Getok(k);startcol=BoundingBox((L-1)*4+1)-2;%开始列startrow=BoundingBox((L-1)*4+2)-2;%开始行width=BoundingBox((L-1)*4+3)+8;%车牌宽hight=BoundingBox((L-1)*4+4)+2;%车牌高rato=width/hight;%计算车牌长宽比if rato>2 & rato<4break;endendsbw1=bw2(startrow:startrow+hight,startcol:startcol+width-1);%获取车牌二值子图subcol1=Sgray(startrow:startrow+hight,startcol:startcol+width-1);%获取车牌灰度子图figure,subplot(2,1,1),imshow(subcol1);title('车牌灰度子图');%输出灰度图像subplot(2,1,2),imshow(sbw1);title('车牌二值子图');%输出车牌的二值图filename='241.jpg';I=im2gray(filename);%调用自编函数读取图像,并转化为灰度图象;tic %计时开始[height,width]=size(I);%预处理I_edge=zeros(height,width);% 创建height*width的矩阵for i=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)));figureimshow(I_edge);title('归一化处理')[I_edge,y1]=select(I_edge,height,width); %%%%%%调用select函数figureimshow(I_edge);title('选择')BW2 = I_edge;%%%%%%%%%%%%%%%%%一些形态学处理SE=strel('rectangle',[10,10]);IM2=imerode(BW2,SE);%腐蚀figureimshow(IM2);title('腐蚀');IM2=bwareaopen(IM2,20);%开运算,消除细小物体figureimshow(IM2);title('开运算');IM3=imdilate(IM2,SE);%膨胀figureimshow(IM2);title('膨胀');%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%投影以粗略估计车牌位置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_h>5));p_h=find(((p_h(1:end-1)-p_h(2:end))~=0));len_h=length(p_h)/2;%%%%%p_v=double((p_v>5));p_v=find(((p_v(1:end-1)-p_v(2:end))~=0));len_v=length(p_v)/2;%%%%%%%%%%%%%%%%%%%%%%%%%%%%粗略计算车牌候选区k=1;for i=1:len_hfor j=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; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%进一步缩小车牌候选区for i=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为一矩阵,用来存放图像块的长宽比例%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%合并临近区域%%%%%%%%如果有多个区域则执行合并if k>1n=0;ncount=zeros(1,k);for i=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(n>0)d_ncount=ncount(2:n+1)-ncount(1:n);%避免重复记录临近的多个区域。