www.gusucode.com > matlab编程简易实现车牌识别源码程序 > matlab编程简易实现车牌识别源码程序/code/main3.m
function main3() I=imread('C:\Users\zhz\Desktop\MATLAB car\MATLAB\car\car2.jpg'); figure(1),imshow(I);title('原图') I1=rgb2gray(I);%功能是将真彩色图像转换为灰度图像,即灰度化处理 I2=edge(I1,'sobel',0.15,'both'); %功能是采用I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0 se=[1;1;1]; I3=imerode(I2,se);%腐蚀 se=strel('rectangle',[25,25]); I4=imclose(I3,se); I4=imclose(I4,se); I5=bwareaopen(I4,1600);%作用是删除二值图像BW中面积小于2000的对象 [y,x,z]=size(I5); %获取图像长度和宽度x、y myI=double(I5);%double类型 %%%%%% Y方向 %%%%%%%%% Blue_y=zeros(y,1);%zeros功能是返回一个m×n×p×...的double类零矩阵 for i=1:y for j=1:x if(myI(i,j,1)==1) Blue_y(i,1)= Blue_y(i,1)+1;%白色像素点统计 end end end top=1; while ((Blue_y(top,1)<5)&&(top<y)) top=top+1; end bottom=y; while ((Blue_y(bottom,1)<5)&&(bottom>top)) bottom=bottom-1; end %%%%%% X方向 %%%%%%%%% Blue_x=zeros(1,x);%进一步确定x方向的车牌区域 for j=1:x for i=top:bottom if(myI(i,j,1)==1) Blue_x(1,j)= Blue_x(1,j)+1; end end end left=1; while ((Blue_x(1,left)<3)&&(left<x)) left=left+1; end right=x; while ((Blue_x(1,right)<3)&&(right>left)) right=right-1; end dw=I(top+5:bottom-5,left+5:right-5,:); figure(7),imshow(dw),title('定位剪切后的彩色车牌图像') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% imwrite(dw,'dw.jpg'); a=imread('dw.jpg'); b=rgb2gray(a); %彩色图像转换为灰度图像,即灰度化处理 imwrite(b,'1.车牌灰度图像.jpg'); figure(8);subplot(5,1,1),imshow(b),title('1.车牌灰度图像') [m,n]=size(b); d=im2bw(b,0.63); imwrite(d,'2.车牌二值图像.jpg'); figure(8);subplot(5,1,2),imshow(d),title('2.车牌二值图像') d=bwareaopen(d,80); figure(8);subplot(5,1,3),imshow(d),title('3.去除白点') % 均值滤波处理 h=fspecial('average',3); d=im2bw(round(filter2(h,d)));% filter2(B,X),B为滤波器.X为要滤波的数据,这里将B放在X上,一个一个移动进行模板滤波. imwrite(d,'4.均值滤波后.jpg'); figure(8),subplot(5,1,4),imshow(d),title('4.均值滤波后') se=eye(2);%产生m×n的单位矩阵 [m,n]=size(d); if bwarea(d)/m/n>=0.365 %bwarea是计算二值图像中对象的总面积的函数 d=imerode(d,se);%腐蚀 elseif bwarea(d)/m/n<=0.235 d=imdilate(d,se);%膨胀 end imwrite(d,'5.膨胀或腐蚀处理后.jpg'); figure(8),subplot(5,1,5),imshow(d),title('5.膨胀或腐蚀处理后') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% d = imrotate(d,180); d=qiege(d); figure(9),imshow(d),title('翻转并进一步切割') figure,subplot(2,1,1),imshow(d),title(n) flag=0;word1=[]; while flag==0 [m,n]=size(d);%将d的尺寸赋给m n wide=1; while sum(d(:,wide+1))~=0 && wide<n %当d图中列的和不全为零时,并 if wide<n wide=wide+1; else flag=1,break%如果d图像素列中存在白色像素点,纵向扫描,列数加1 end end zhz=wide; if wide<10 % 认为是左侧干扰 d(:,[1:wide])=0;%将干扰全部消除,赋零 d=qiege(d); flag=1; else flag=1; end end [word7,d]=getword(d);%分割出第二个字符 [word6,d]=getword(d);% 分割出第三个字符 [word5,d]=getword(d);% 分割出第四个字符 [word4,d]=getword(d);% 分割出第五个字符 [word3,d]=getword(d);% 分割出第六个字符 [word2,d]=getword(d); flag=0;word1=[]; d = imrotate(d,180); while flag==0 [m,n]=size(d);%将d的尺寸赋给m n wide=2; while sum(d(:,wide-1))~=0 && wide<n %当d图中列的和不全为零时 %防止索引超出范围 wide=wide+1;%如果d图像素列中存在白色像素点,纵向扫描,列数加1 end if wide<10 % 认为是左侧干扰 d(:,[1:wide])=0;%将干扰全部消除,赋零 d=qiege(d); flag=1; else flag=1; end end word1=qiege(d); subplot(5,7,1),imshow(word1),title('1'); subplot(5,7,2),imshow(word2),title('2'); subplot(5,7,3),imshow(word3),title('3'); subplot(5,7,4),imshow(word4),title('4'); subplot(5,7,5),imshow(word5),title('5'); subplot(5,7,6),imshow(word6),title('6'); subplot(5,7,7),imshow(word7),title('7'); [m,n]=size(word1); % 归一化大小为 40*20 word1=imresize(word1,[40 20]); word2=imresize(word2,[40 20]); word3=imresize(word3,[40 20]); word4=imresize(word4,[40 20]); word5=imresize(word5,[40 20]); word6=imresize(word6,[40 20]); word7=imresize(word7,[40 20]); subplot(5,7,15),imshow(word1),title('1(40X20)'); subplot(5,7,16),imshow(word2),title('2(40X20)'); subplot(5,7,17),imshow(word3),title('3(40X20)'); subplot(5,7,18),imshow(word4),title('4(40X20)'); subplot(5,7,19),imshow(word5),title('5(40X20)'); subplot(5,7,20),imshow(word6),title('6(40X20)'); subplot(5,7,21),imshow(word7),title('7(40X20)'); 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');