简单车辆检测源码

2017 年 7 月 8 日 计算机视觉战队 Edison_G

简单车牌检测


main:

clc;

clear;

close all;

I=imread('1.png');

figure(1),imshow(I);title('原图');

I1=rgb2gray(I);

figure(2),subplot(1,2,1),imshow(I1);title('灰度图');

figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');

I2=edge(I1,'canny',[0.2,0.55]);

figure(3),imshow(I2);title('canny算子边缘检测');

se=[1;1;1];

I3=imerode(I2,se);

figure(4),imshow(I3);title('腐蚀后图像');

se=strel('rectangle',[40,40]);

I4=imclose(I3,se);

figure(5),imshow(I4);title('平滑图像的轮廓');

I5=bwareaopen(I4,2000);

figure(6),imshow(I5);title('从对象中移除小对象');

[y,x,z]=size(I5);

myI=double(I5);

    %begin横向扫描

     Blue_y=zeros(y,1);

      for i=1:y

         for j=1:x

             if(myI(i,j,1)==1) 

          %如果myI(i,j,1)即myI图像中坐标为(i,j)的点为蓝色

          %则Blue_y的相应行的元素white_y(i,1)值加1

           Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计 

             end  

         end    

      end

[temp MaxY]=max(Blue_y);%temp为向量white_y的元素中的最大值,MaxY为该值的索引( 在向量中的位置)

PY1=MaxY;

     while ((Blue_y(PY1,1)>=50)&&(PY1>1))

          PY1=PY1-1;

     end    

 PY2=MaxY;

     while ((Blue_y(PY2,1)>=10)&&(PY2<y))

        PY2=PY2+1;

     end

     IY=I(PY1:PY2,:,:);

%IY为原始图像I中截取的纵坐标在PY1:PY2之间的部分

 %end横向扫描

 %begin纵向扫描

      Blue_x=zeros(1,x);%进一步确定x方向的车牌区域

 for j=1:x

         for i=PY1:PY2

             if(myI(i,j,1)==1)

                  Blue_x(1,j)= Blue_x(1,j)+1;               

             end  

         end       

 end

 PX1=1;

      while ((Blue_x(1,PX1)<3)&&(PX1<x))

          PX1=PX1+1;

      end    

 PX2=x;

      while ((Blue_x(1,PX2)<3)&&(PX2>PX1))

             PX2=PX2-1;

      end 

 PX1=PX1-1;

 PX2=PX2+15;

 PY1=PY1-2.5;

 %end纵向扫描

 dw=I(PY1:PY2,PX1:PX2,:);

 imwrite(dw,'dw.jpg');

figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');

figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')

%利用radon变换做水平矫正

bw=rgb2gray(dw);

bw1=edge(bw,'sobel','horizontal');

theta=0:179;

r=radon(bw1,theta);

[m,n]=size(r);

c=1;

for i=1:m

    for j=1:n

        if r(1,1)<r(i,j)

            r(1,1)=r(i,j);

            c=j;

        end

    end

end

rot=90-c+2;

pic=imrotate(bw,rot,'crop');

figure(8),subplot(3,1,1),imshow(bw),title('1.定位后的这牌灰度图像');

figure(8),subplot(3,1,2),imshow(pic),title('2.利用radon算子做水平方向矫正');

%利用radon变换做垂直方向的矫正

binaryImage = edge(pic,'canny'); 

binaryImage = bwmorph(binaryImage,'thicken'); 

theta = -90:89;

[R,xp] = radon(binaryImage,theta);

%%%%%

[R1,r_max] = max(R);

theta_max = 90;

while (theta_max > 50 || theta_max<-50)

    [R2,theta_max] = max(R1);                      

    R1(theta_max) = 0; 

    theta_max = theta_max - 91;

end

%角度计算完毕

H=[1,0,0; tan(-theta_max),1,0;0,0,1];

T=maketform('affine',H);

pic=imtransform(pic,T);

figure(8),subplot(3,1,3), imshow(pic);title('3.利用radon算子做垂直方向矫正');

%字符分割前的预处理

g_max=double(max(max(pic)));

g_min=double(min(min(pic)));

T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值

[m,n]=size(pic);

d=im2bw(pic,T/256);  % d:二值图像

figure(9);subplot(2,2,1),imshow(d),title('1.车牌二值图像')

% 滤波

h=fspecial('average',3);

d=im2bw(round(filter2(h,d)));

figure(9),subplot(2,2,2),imshow(d),title('2.均值滤波后')

% 某些图像进行操作

% 膨胀或腐蚀

se=strel('square',3); % 使用一个3X3的正方形结果元素对象对创建的图像膨胀

se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵

[m,n]=size(d);

if bwarea(d)/m/n>=0.365

       d=imerode(d,se);

elseif bwarea(d)/m/n<=0.235

       d=imdilate(d,se);

end

figure(9),subplot(2,2,3),imshow(d),title('3.膨胀或腐蚀处理后')

%对图像的边框进行裁剪,只留下有效字符部分

[y1,x1,z1]=size(d);

I3=double(d);

TT=1;

Y1=zeros(y1,1);

 for i=1:y1

    for j=1:x1

             if(I3(i,j,1)==1) 

                Y1(i,1)= Y1(i,1)+1 ;

            end  

     end       

 end

Py1=1;

Py0=1;

while ((Y1(Py0,1)<30)&&(Py0<y1))

      Py0=Py0+1;

end

Py1=Py0;

 while((Y1(Py1,1)>=30)&&(Py1<y1))

         Py1=Py1+1;

 end

d=d(Py0:Py1,:,:);

figure(9),subplot(2,2,4);

imshow(d),title('4.目标车牌区域');

%在列方向上进行灰度值累加

X1=zeros(1,x1);

for j=1:x1

    for i=1:y1

             if(I3(i,j,1)==1) 

                X1(1,j)= X1(1,j)+1;

            end  

     end       

end

figure(10);

plot(0:x1-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量');

Px0=1;

Px1=1;

%%%%%%%%%%%%分割字符%%%%%%%%%%%%%%%%%%

for i=1:7

  while ((X1(1,Px0)<2)&&(Px0<x1))

      Px0=Px0+1;

  end

  Px1=Px0;

  while (((X1(1,Px1)>=3)&&(Px1<x1))||((Px1-Px0)<10))

      Px1=Px1+1;

  end

  Z=d(:,Px0:Px1,:);

  switch strcat('Z',num2str(i))

      case 'Z1'

          PIN0=Z;

      case 'Z2'

          PIN1=Z;

      case 'Z3'

          PIN2=Z;

      case 'Z4'

          PIN3=Z;

      case 'Z5'

          PIN4=Z;

      case 'Z6'

          PIN5=Z;

      otherwise 

          PIN6=Z;

  end

  figure(11);

  subplot(1,7,i);

  imshow(Z);

  Px0=Px1;

end

%载入训练好的神经网络%

load('-mat','ym');

%将分割后的后的车牌字符归一化处理%

PIN0=pretreatment(PIN0);

PIN1=pretreatment(PIN1);

PIN2=pretreatment(PIN2);

PIN3=pretreatment(PIN3);

PIN4=pretreatment(PIN4);

PIN5=pretreatment(PIN5);

PIN6=pretreatment(PIN6);

P0=[PIN0',PIN1',PIN2',PIN3',PIN4',PIN5',PIN6'];

%开始识别字符

for i=2:7

  T0= sim(net ,P0(:,i));

  T1 = compet (T0) ;

  d =find(T1 == 1)-1

 if (d==0)

    str='A';

 elseif (d==1)

     str='B';

 elseif (d==2)

     str='C';

 elseif (d==3)

     str='D';

 elseif (d==4)

     str='E';

 elseif (d==5)

     str='F';

 elseif (d==6)

     str='G';

 elseif (d==7)

     str='H';

 elseif (d==8)

     str='I';

 elseif (d==9)

     str='J';

 elseif (d==10)

     str='K';

 elseif (d==11)

     str='L';

 elseif (d==12)

     str='M';

 elseif (d==13)

     str='N';

 elseif (d==14)

     str='O';

 elseif (d==15)

     str='P';

 elseif (d==16)

     str='Q';

 elseif (d==17)

     str='R';

 elseif (d==18)

     str='S';

 elseif (d==19)

     str='T';

 elseif (d==20)

     str='U';

 elseif (d==21)

     str='V';

 elseif (d==22)

     str='W';

 elseif (d==23)

     str='X';

 elseif (d==24)

     str='Y';

 elseif (d==25)

     str='Z';

 else

    str=num2str(d);

 end

 switch i

     case 2

         str1=str;

     case 3

         str2=str;

     case 4

         str3=str;

     case 5

         str4=str;

     case 6

         str5=str;

     otherwise

         str6=str;

  end

end 

s=strcat('京',str1,'.',str2,str3,str4,str5,str6); 

figure(12);

imshow('dw.jpg'),title(s);


pretreatment.m

function  inpt  = pretreatment(I)

%图像归一化处理以及特征提取

%if isrgb(I)

%   I1 = rgb2gray(I);

%else

%   I1=I;

%end

%I1 = rgb2gray(I);

%将图片统一划为50*20大小

I=imresize(I,[50 20]);

I=im2bw(I,0.9);

[m,n]=size(I);

inpt=zeros(1,m*n);

%将图像按列转换成一个行向量

for j=1:n

    for i=1:m

        inpt(1,m*(j-1)+i)=I(i,j);

    end

end


bp.m

function bp()

%use for bp training

I0=pretreatment(imread('A.jpg'));

I1=pretreatment(imread('B.jpg'));

I2=pretreatment(imread('C.jpg'));

I3=pretreatment(imread('D.jpg'));

I4=pretreatment(imread('E.jpg'));

I5=pretreatment(imread('F.jpg'));

I6=pretreatment(imread('G.jpg'));

I7=pretreatment(imread('H.jpg'));

I8=pretreatment(imread('I.jpg'));

I9=pretreatment(imread('J.jpg'));

I10=pretreatment(imread('K.jpg'));

I11=pretreatment(imread('L.jpg'));

I12=pretreatment(imread('M.jpg'));

I13=pretreatment(imread('N.jpg'));

I14=pretreatment(imread('O.jpg'));

I15=pretreatment(imread('P.jpg'));

I16=pretreatment(imread('Q.jpg'));

I17=pretreatment(imread('R.jpg'));

I18=pretreatment(imread('S.jpg'));

I19=pretreatment(imread('T.jpg'));

I20=pretreatment(imread('U.jpg'));

I21=pretreatment(imread('V.jpg'));

I22=pretreatment(imread('W.jpg'));

I23=pretreatment(imread('X.jpg'));

I24=pretreatment(imread('Y.jpg'));

I25=pretreatment(imread('Z.jpg'));

P=[I0',I1',I2',I3',I4',I5',I6',I7',I8',I9',I10',I11',I12',I13',I14',I15',I16',I17',I18',I19',I20',I21',I22',I23',I24',I25'];

%输出样本%

T=eye(26,26);

%%bp神经网络参数设置

net=newff(minmax(P),[800,23,26],{'logsig','logsig','logsig'},'trainrp');

net.inputWeights{1,1}.initFcn ='randnr';

net.layerWeights{2,1}.initFcn ='randnr';

net.trainparam.epochs=5000;

net.trainparam.show=50;

net.trainparam.goal=0.0000000001;

net=init(net);

%%%训练样本%%%%

[net,tr]=train(net,P,T);

save('ym','net');


登录查看更多
1

相关内容

华为发布《自动驾驶网络解决方案白皮书》
专知会员服务
125+阅读 · 2020年5月22日
【大数据白皮书 2019】中国信息通信研究院
专知会员服务
137+阅读 · 2019年12月12日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
源码解析 | 图像质量损失函数SSIM Loss的原理详解和代码具体实现
人工智能前沿讲习班
6+阅读 · 2019年6月2日
目标检测之非极大值抑制(NMS)各种变体
极市平台
3+阅读 · 2019年5月2日
OpenCV特征提取与图像检索实现(附代码)
实战|手把手教你实现图象边缘检测!
全球人工智能
10+阅读 · 2018年1月19日
简单车牌检测
计算机视觉战队
6+阅读 · 2017年6月23日
Arxiv
9+阅读 · 2018年5月7日
Arxiv
7+阅读 · 2018年1月24日
VIP会员
相关资讯
源码解析 | 图像质量损失函数SSIM Loss的原理详解和代码具体实现
人工智能前沿讲习班
6+阅读 · 2019年6月2日
目标检测之非极大值抑制(NMS)各种变体
极市平台
3+阅读 · 2019年5月2日
OpenCV特征提取与图像检索实现(附代码)
实战|手把手教你实现图象边缘检测!
全球人工智能
10+阅读 · 2018年1月19日
简单车牌检测
计算机视觉战队
6+阅读 · 2017年6月23日
Top
微信扫码咨询专知VIP会员